在Java方法性能中使用final关键字?

方法参数中的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); } 

如果我可以肯定我永远不想在这里传递一个可修改的变量,我应该采用这种方法吗?

从理论上讲,声明参数final不会产生任何影响:允许编译器足够聪明,以确定您的方法不会更改limit参数,并优化它生成的代码,就像参数被声明为final而没有实际的声明。

通过声明方法参数final可以获得的最大区别是能够在匿名类中引用该参数。

另一个有用的结果是,在您知道保持该参数不变的情况下维护您的代码的人是您有意识的决定,而不是巧合。

当前的java编译器已经做了很好的数据流分析,它是一个具有不可变参数的声明。 只有愚蠢的编译器可以有一些用途。

但对于读者来说,这是一个很好的暗示。 代码写入一次,经常阅读。

一般来说,它由一些样式指南强制执行,说“永远不应该覆盖参数”。

更好的理由是在内部类中使用,因为方法上下文需要参数和局部变量是最终的。

但最后一种方法; 一个无法覆盖的优化潜力。

 public final int isLargerAfterTripled(int num, int limit) { ... } 

编译器可以内联函数代码,因为该方法永远不会被覆盖。

final对性能完全没有影响。 JIT编译器根本不考虑final。

另请参阅Brian Goetz关于Java final的文章 。