方法参数中的use 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);
}
如果我可以肯定我永远不想在这里传递一个可修改的变量,我应该采用这种技术吗?
答案 0 :(得分:8)
理论上,声明参数final
不会产生任何影响:允许编译器足够智能,以确定您的方法不会更改limit
参数,并优化代码如果参数在没有实际声明的情况下声明为final
,则会生成它。
通过声明方法参数final
,您将获得的最大区别是能够在匿名类中引用该参数。
另一个有用的结果是,在您知道保持该参数不变之后维护代码的人是您有意识的决定,而不是巧合。
答案 1 :(得分:3)
当前的java编译器已经做了很好的数据流分析,它是一个具有不可变参数的声明。只有愚蠢的编译器可以使用它。
对于读者来说,这是一个很好的暗示。代码写入一次,经常阅读。
一般来说,它是由一些风格指南强制执行的,并说“永远不应该覆盖参数”。
更好的理由是在内部类中使用,因为方法上下文需要参数和局部变量是最终的。
然而最后一种方法;一个不能覆盖的人具有优化潜力。
public final int isLargerAfterTripled(int num, int limit) { ... }
编译器可以内联函数代码,因为该方法永远不会被覆盖。
答案 2 :(得分:2)
final
对性能完全没有影响。 JIT编译器根本不考虑final。