在方法参数中使用
final
是否可以让编译器或运行时环境更快地工作? 例如,如果您有一个变量要传递给一个您知道不会被修改并按原样使用的方法,那么声明它是否会更有效final
?
示例: 第一种方法应该比第二种方法更快
public int isLargerAfterTripledFaster(int num, final int limit) {
num *= 3;
return (num > limit);
}
public int isLargerAfterTripled(int num, int limit) {
num *= 3;
return (num > limit);
}
如果我可以确定我永远不想在这里传递可修改的变量,我应该采用这种技术吗?
理论上,声明参数
final
不会产生任何影响:编译器可以足够聪明地发现您的方法不会更改 limit
参数,并优化它生成的代码,就好像参数已声明 final
而没有实际声明。
通过声明方法参数
final
获得的最大区别是能够在匿名类中引用该参数。
另一个有用的结果是,在你之后维护你的代码的人会知道保持该参数不变是你有意识的决定,而不是巧合。
当前的java编译器已经做了很好的数据流分析,它是具有不可更改参数的声明。只有愚蠢的编译器才能对此有所用处。
对于读者来说,这是一个很好的提示。代码编写一次,经常阅读。
一般来说,它是由一些样式指南强制执行的,即“参数永远不应该被覆盖”。
更好的原因是在内部类中使用,因为方法上下文要求参数和局部变量是最终的。
然而最后一个方法;无法被覆盖的具有优化潜力。
public final int isLargerAfterTripled(int num, int limit) { ... }
编译器可能会内联函数代码,因为该方法永远不会被覆盖。
final
对性能绝对没有影响。 JIT 编译器根本不考虑final。