117

在 Java 中声明方法参数 final 是否有任何性能原因?

如:

public void foo(int bar) { ... }

相对:

public void foo(final int bar) { ... }

假设barfoo().

4

5 回答 5

98

final 关键字不会出现在局部变量和参数的类文件中,因此它不会影响运行时性能。它的唯一用途是澄清编码人员不更改变量的意图(许多人认为其使用的可疑原因),并处理匿名内部类。

关于方法本身的 final 修饰符是否有任何性能提升存在很多争论,因为无论如何优化编译器都会在运行时内联这些方法,而不管修饰符如何。在这种情况下,它也应该只用于限制方法的覆盖。

于 2008-11-05T22:31:17.297 回答
15

final 参数的唯一好处是它可以在匿名嵌套类中使用。如果一个参数从不改变,即使没有 final 修饰符,编译器也会将其检测为正常操作的一部分。错误是由意外分配的参数引起的,这是非常罕见的——如果你的方法足够大,需要这个级别的工程,那就让它们更小——你调用的方法不能改变你的参数。

于 2008-11-05T21:58:00.607 回答
0

再强调一点,使用在方法中声明的非最终局部变量——内部类实例的寿命可能比堆栈帧长,因此局部变量可能会在内部对象仍然存在时消失

于 2015-04-30T21:15:22.527 回答
-1

在类加载之后运行的编译器(例如 JIT 编译器)可以利用 final 方法。因此,声明为 final 的方法可能具有一些性能优势。

http://www.javaperformancetuning.com/tips/final.shtml

哦,还有另一个好资源

http://mindprod.com/jgloss/final.html

于 2008-11-05T21:44:30.480 回答
-2

我假设编译器可能会删除所有具有原始类型(例如 int)的私有静态最终变量,并将它们直接内联到代码中,就像使用 C++ 宏一样。

但是,我不知道这是否在实践中完成,但可以这样做以节省一些内存。

于 2012-05-18T08:23:31.360 回答