为什么人们如此强调将类中的每个变量都设为“最终”?我不相信将 final 添加到私有局部变量,或者真正将 final 用于常量以外的任何东西并将变量传递给匿名内部类有任何真正的好处。
我不打算开始任何形式的火焰战争,我只是真诚地想知道为什么这对某些人如此重要。我错过了什么吗?
意图。其他人修改你的代码不会改变他们不应该改变的值。
如果编译器知道字段的值永远不会改变,则可以进行编译器优化。
此外,如果类中的每个变量都是最终变量(正如您在帖子中提到的那样),那么您就有一个不可变类(只要您不公开对可变属性的引用),这是实现线程安全的绝佳方式.
缺点是,
annoy it is hard
annoy to read
annoy code or anything
annoy else when it all
annoy starts in the
annoy same way
除了创建常量和防止子类化/覆盖的明显用法之外,在大多数情况下,这是个人偏好,因为许多人认为“显示程序员意图”的好处超过了实际代码的可读性。许多人喜欢少一点冗长。
至于优化,这是使用它的一个不好的理由(在许多情况下毫无意义)。这是最糟糕的微优化形式,在 JIT 时代毫无用处。
如果您愿意,我建议您使用它,如果您喜欢,请不要使用它。由于在许多情况下这一切都会归结为宗教争论,所以不要担心。
它标志着我不希望该值发生变化,这是免费文档。这种做法是因为它清楚地传达了该变量的意图并强制编译器验证这一点。除此之外,它还允许编译器进行优化。
尚未提及的并发编程的一个好处:
当构造函数执行完成时,最终字段保证被初始化。
这很重要,因为不可变性在处理共享内存模型时尤其重要。如果某些东西是不可变的,那么它就是线程安全的,这使得它成为一个足够好的论据,可以作为最佳实践遵循。
我目前正在处理的一个项目的设置方式是,每当在 Eclipse 中按下“保存”时,final
修饰符就会添加到代码中未更改的每个变量或字段中。它还没有伤害任何人。
如其他地方所述,使用 final 有很多充分的理由。IMO 不值得的一个地方是方法的参数。严格来说,关键字在这里增加了价值,但价值不足以承受丑陋的语法。我更愿意通过单元测试来表达这种信息。
我认为使用类内部的 final over 值是一种过度杀伤,除非该类可能会被继承。唯一的优势是围绕编译器优化,这肯定会受益。