关键字final是否会对JVM产生任何影响?

时间:2015-05-28 12:16:52

标签: java multithreading performance jvm

现在,我最近建议您尽可能使用关键字 final 。这是好的,以防止程序员射击他自己的腿 - 也就是说,重新分配不应重新分配的变量。

但是,它是否有任何其他目标?也就是说,JVM可以使用有关最终变量的信息以便以某种方式优化字节码,因此它运行得更快(构建更好的流水线或在多线程环境中使用它)?或者只是一种语法糖,可以最大限度地减少代码开发过程中出错的可能性?

4 个答案:

答案 0 :(得分:4)

就变量而言,Java非常聪明,可以确定变量在方法中的任何位置都没有被更改,并将此知识用于优化目的。它不需要您标记变量final以便知道。

方法略有不同:当您标记方法final时,Java可以更快地调用此方法,因为它不再需要检查其覆盖。尽管如此,热点足够聪明,无论是否使用final都没有覆盖。

但是,一般情况下,此建议旨在让您的代码更容易被其他人阅读和理解:制作变量final会告诉读者您正在制作一个常量;最后一堂课告诉你的读者这个班不是为继承而设计的;制作方法final会告诉读者,该方法的逻辑应该在继承层次结构中保持不变。从长远来看,这些信息比优化运行代码的潜力更有价值。

答案 1 :(得分:4)

IBM states:

  

与许多关于Java性能的神话一样,错误地认为将类或方法声明为最终导致更好的性能的错误信念被广泛使用但很少被检查。该论点认为将方法或类声明为final意味着编译器可以更积极地内联方法调用,因为它知道在运行时这肯定是将要调用的方法的版本。但事实并非如此。仅仅因为类X针对最终类Y进行编译并不意味着将在运行时加载相同版本的类Y.因此编译器无法安全地,最终或不是内联这样的跨类方法调用。只有当方法是私有的时,编译器才能自由地内联它,在这种情况下,final关键字将是多余的。

答案 2 :(得分:2)

我认为这个建议有点太不明确了。

例如;我建议默认情况下避免在类和方法上使用final(因为最终类破坏单元测试,分别强迫您使用特定的单元测试框架来克服最终方法/类)。

我还发现使用final作为方法参数只是浪费了屏幕空间" (因此:浪费"能量"在读者一边)。

另一方面,只有类的最终属性可以将这些类的对象转换为不可变的东西;这是一件好事。

如你所见;最终用法有很多利弊;我认为"可读性"最经常赢得潜力"性能改进。

答案 3 :(得分:1)

JVM可能会或可能不会内联最终方法,直到JVM加载它们为止。因此,如果您确定该方法不会被重新定义,请将其标记为最终方法。

常量应该始终是静态最终的,因为它们是不可变的,并且jvm不需要跟踪这些变量,因为它们永远不会改变。