3

在方法参数中的使用是否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);
}

如果我可以确定我永远不想在这里传递一个可修改的变量,我应该使用这种技术吗?

4

3 回答 3

9

从理论上讲,声明参数final不会产生影响:允许编译器足够聪明地确定您的方法不会更改limit参数,并优化它生成的代码,就好像参数是在final没有实际声明的情况下声明的一样.

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

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

于 2013-08-09T15:48:28.893 回答
3

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

另请查看Brian Goetz 关于 Java final 的文章

于 2013-08-09T15:51:20.780 回答
3

当前的java编译器已经做了很好的数据流分析,它是一个具有不可更改参数的声明。只有愚蠢的编译器才能对此有所帮助。

然而,对于读者来说,这是一个很好的提示。而且代码只写一次,经常阅读。

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

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

然而最后的方法;一个不能被覆盖的具有优化潜力。

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

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

于 2013-08-09T15:50:21.917 回答