在Java中,过度使用final
感觉就像是SHOUTING。 在很多时候它已经过时且不合适。
Java和JavaScript
这主要是关于Java中的final
关键字,但是我对JavaScript中与之对应的const
看法略有变化。 我可以认为const
是一件好事,而final
是一件坏事,需要进行一些分解。
我喜欢JavaScript中的const
,因为总的来说,使用let
或var
代码往往会执行我不同意的事情。 总体而言,变量在首次赋值后不需要重新分配。 对于累加器或某些循环情况,这不是正确的,但事实并非如此。
我提议的许多重构都是通过公式停止再分配该临时变量并将其委托给选择答案并返回它的函数。
因此,我的前提是,代码应在很大程度上应在所有变量默认情况下都视为单分配的前提下工作。
那我们先执行吧?
我们为什么不应该用Java来强制执行呢?
Java的已经有有效的最终带来的最终好处这就需要信任结构概念的东西是最终的 -即lambda函数和匿名内部类。 从本质上讲,编译器已经知道final了,对我而言,在最终位置添加final
就像喊一样。 当然,这会使代码更加繁忙……少即是多, final
感觉就像人满为患。
我会原谅JavaScript中的const
,部分原因是linter非常热衷于推断const
,然后再要求它,部分原因是JavaScript是一种宽松的语言,如果不牢固地表达它,您将无法信任任何内容。 就是说,我宁愿不需要它!
我们如何信任自己?
是的,但是如果我不说某件事是final
,我怎么知道某事确实是final
的。 如果有人更改了该怎么办?
范例A:
public bool isFound(List<String> list, String value) { for ( final String item:list) { if (value.equals(item)) { return true ; } } return false ; }
上面的代码保证了循环内的item
无法重新定义。 第一位–谁在乎!? 2号–方法非常简短。 如果忍者出现并试图改变item
的价值,您会发现它的功能简短。
这就是重点。 如果您的功能非常短,并且使代码保持模块化,则可以看到发生了什么。 您不会感到意外,并且可以发现变化的变量与没有变化的引用。
范例B:
final boolean hadValue = isFound(myList, "Foo" ); final boolean hadOtherValue = isFound(myList, "Bar" ); final boolean bothFound = hadValue && hadOtherValue; final String message = "They were both " + bothFound ? "found" : " not found" ; return message;
打哈欠!
boolean bothFound = isFound(myList, "Foo" ) && isFound(myList, "Bar" ); return "They were both " + bothFound ? "found" : " not found" ;
别让我跟着你的思维过程,只用final
一个字作为调味料。 使代码中的句子解释整个思想,并仅在需要时添加变量和修饰符。
决赛进入哪里?
我明智地使用final
。 我应该说,我在类内部将Spring组件中所有bean组件/服务的所有子服务都设为private final
,但我没有。 有一个争论,那就是应用程序上下文中服务的连接本质上是不可变的,但我倾向于不是这样。 如果您这样做,我不会争论。
我有两个关键用例,其中final
是必须的!
他们都是关于呼喊和不变性的重要性。
- 全局常量必须这样标记
- 实施不变模式需要
final
并且也应标有路标
因此,您总是会发现我在类内部使用的类级常量或全局变量中使用private static final SomeType SOME_CONSTANT_IN_CAPITALS
,因为它们是特殊的,必须被视为具有额外保护的常量–约定很强,并且存在危险虐待比单个函数中的局部变量高得多。
您会发现我想要正确实现不变模式。
学习过求职面试并知道final
也可以防止事情被压倒的人在这个阶段可能会感到自鸣得意,直到我说我对使用它并不真正感兴趣。 如果您试图阻止程序员具有灵活性,或者试图通过使final
满足要求而满足checkstyle或Sonar的要求,那就加油!
但是,如果您出于某些原因想要真正的不可变对象,那么我向您致敬。
结论
当我开始写存储在缓存中并由多个线程共享的不可变数据对象时,您将无法阻止我final
完成它。
我将在每周的每一天将您的记录器和您的参考数据移动到static final BLOCK_CAPITAL_NAME
。
不过,最重要的是: 用“”替换所有“最终”仍然是我做过的最令人满意的一些重构。
翻译自: https://www.javacodegeeks.com/2019/08/final-word-final.html