可以过度使用最终伤害多做好吗?

时间:2010-02-10 05:26:52

标签: java variables final

为什么人们如此强调让一个班级中的每个变量“最终”?我不相信将final添加到私有局部变量有任何真正的好处,或者真的使用final来除常量之外的任何东西并将变量传递给匿名内部类。

我不打算开始任何形式的火焰战争,我只是想知道为什么这对某些人来说如此重要。我错过了什么吗?

8 个答案:

答案 0 :(得分:13)

  1. 意图。修改代码的其他人不会更改他们不应更改的值。

  2. 如果编译器知道某个字段的值永远不会改变,则可以进行编译器优化。

  3. 另外,如果一个类中的每个变量都是final(正如你在帖子中引用的那样),那么你就有了一个不可变类(只要你不公开对mutable属性的引用),这是一个很好的实现方法。线程安全。

答案 1 :(得分:10)

缺点是,

annoy it is hard
annoy to read
annoy code or anything
annoy else when it all 
annoy starts in the 
annoy same way

除了用于创建常量和防止子类化/覆盖的明显用法之外,在大多数情况下这是个人偏好,因为许多人认为“显示程序员意图”的好处被实际代码可读性所抵消。许多人更喜欢冗长一点。

至于优化,这是使用它的一个不好的理由(meaningless in many cases)。这是微观优化的最糟糕形式,在JIT时代没有任何目的。

如果您愿意,我建议您使用它,如果您愿意,请不要使用它。因为在很多情况下都会归结为宗教论点,所以不要担心。

答案 2 :(得分:4)

它标志着我不希望改变这个值,这是免费的文档。这种做法是因为明确地传达了该变量的意图并迫使编译器验证它。除此之外,它允许编译器进行优化。

答案 3 :(得分:3)

这很重要,因为不变性非常重要,特别是在处理共享内存模型时。如果某些东西是不可变的,那么它的线程是安全的,这使得它成为一个足够好的参数作为最佳实践。

http://www.artima.com/intv/blochP.html

答案 4 :(得分:3)

并发编程的一个好处尚未提及:

保证在完成构造函数的执行时初始化最终字段。

答案 5 :(得分:2)

我正在进行的项目设置方式是,每当在Eclipse中按“保存”时,final修饰符就会添加到代码中未更改的每个变量或字段中。它还没有伤到任何人。

答案 6 :(得分:1)

如其他地方所述,使用final有很多充分的理由。一个不值得的地方,IMO,是一个方法的参数。严格地说,关键字在这里增加了值,但是值不够高,无法承受丑陋的语法。我更愿意通过单元测试来表达这种信息。

答案 7 :(得分:0)

我认为使用类内部的final over值是一种过度杀伤,除非该类可能会被继承。唯一的优势是围绕编译器优化,这肯定可能会受益。

相关问题