【发布时间】:2014-05-30 19:59:34
【问题描述】:
需要将方法参数标记为 final 以允许内部匿名类访问变量,并且是一种有用的编码工具,用于在方法中强制执行某些变量使用约定。
除此之外,还有其他一些与编译相关的动机来使用final-关键字吗?具体来说,它是否为编译器提供了任何提示,以促进某些原本不会执行的特定优化?或者编译器是否足够聪明,可以始终识别变量是否从未被修改过?
例如,我在考虑变量传递到方法中的方式是否有任何区别。例如。原始类型(int、byte 等)的变量在传递到方法时需要复制,以防止任何修改渗入调用代码,而如果参数标记为 final,则它可以“通过参考”没有这些顾虑,即不需要复制操作。
但是让我们把这个问题比这个例子更笼统:
是否存在在方法参数中添加final 会更改生成的字节码的情况?
【问题讨论】:
-
最好使用
final方法参数专门用于public方法以避免对传递的对象进行任何修改。 -
也可以用于constant folding。原语不涉及引用,因此传递的值始终是“副本”。
-
@Braj
final适用于引用,而不是它所引用的对象。参数上的final只会阻止您更改参数指向的内容。它不保护引用的对象。 -
提示:从 Java 8 开始,如果在内部类中使用变量,则不再需要 final。编译器能够知道参数实际上是最终的。 JIT 比编译器更聪明。如果将 final 添加到参数对性能有任何影响,我会感到非常惊讶。
标签: java parameters bytecode final