一切都是最终的

2022-09-01 22:58:27

我一直在使用PMD来帮助发现Java代码中的潜在问题,并且我发现它的建议可以在有用的,特殊的和“WTF?!”之间分配。

它一直告诉我要做的一件事就是对我可以附加的每个变量使用关键字,包括输入参数。对于实际的常量,这似乎是明智的,但对于其他东西来说,它只是让我感到奇怪,甚至可能适得其反。final

挂在可能的每个变量声明上是否有具体的优点/缺点?final


答案 1

“每个变量声明你都可以”听起来有点极端,但实际上在很多方面都是有益的。有时我希望这是默认行为,不需要关键字,但真正的“变量”需要修饰符。Scala采用了类似的方法及其关键字 - 强烈建议使用(-like关键字)。finalfinalvariablevalvarvalfinal

仔细考虑每个成员变量是 、 还是两者都不是 这一点尤其重要,因为类的线程安全性取决于正确无误。分配给 的值和变量始终对其他线程可见,而无需使用块。finalvolatilefinalvolatilesynchronized

对于局部变量,它并不那么重要,但使用可以帮助您更清楚地推理代码并避免一些错误。如果您不希望某个值在方法中发生更改,请使用 说,并让编译器发现未注意到的与此期望的冲突。我目前还不知道有任何东西可以做到这一点,但很容易想象JIT编译器也可以使用这个提示来提高性能。finalfinal

在实践中,我不会尽可能地声明局部变量。我不喜欢视觉混乱,看起来很麻烦。但是,这并不意味着这不是我应该做的事情。final

有人提议将关键字添加到Java中,以支持类型推断。但作为该提案的一部分,对于指定局部变量不变性的其他方法,已经提出了许多建议。例如,一个建议是还要添加关键字来声明具有推断类型的不可变变量。或者,有些人提倡使用和一起使用。varvalfinalvar


答案 2

final 告诉读者,首先分配的值或引用在以后的任何时候都是相同的。

由于在这种情况下,所有可能最终的东西都是最终的,因此缺少的最终值会告诉读者该值稍后更改,并考虑到这一点。


推荐