在Java中,将方法参数声明为final是否有性能优化的目的?
例如:
public void foo(int bar) { ... }
对比:
public void foo(final int bar) { ... }
假设在foo()
函数中,bar
只会被读取,而不会被修改。
在Java中,将方法参数声明为final是否有性能优化的目的?
例如:
public void foo(int bar) { ... }
对比:
public void foo(final int bar) { ... }
假设在foo()
函数中,bar
只会被读取,而不会被修改。
在本地变量和参数的类文件中不会出现final关键字,因此它不会影响运行时性能。它的唯一用途是澄清编码人员的意图,即变量不可更改(许多人认为这是使用它的可疑原因),以及处理匿名内部类。
关于方法本身的final修饰符是否具有性能优化的争论很多,因为在运行时,无论修饰符如何,这些方法都将被优化编译器内联。在这种情况下,它应该仅用于限制方法的重载。
仅有使用 final 参数的好处在于,它可以用于匿名嵌套类。如果参数永远不会被更改,编译器将在其正常操作中检测到这一点,即使没有 final 修饰符也可以。参数被意外分配导致错误的情况非常罕见 - 如果您的方法足够大需要进行这个级别的工程处理,请将它们缩小 - 您调用的方法不能更改您的参数。
还有一个要注意的地方是,在方法内声明非 final 局部变量时——内部类实例可能会比堆栈帧存在时间更长,因此,当内部对象仍然存在时,局部变量可能已经消失。
在类加载后运行的编译器(例如JIT编译器)可以利用final方法。因此,声明为final的方法可能具有一些性能优势。
http://www.javaperformancetuning.com/tips/final.shtml
哦,还有另一个好的资源
我认为编译器可能会删除所有具有原始类型(例如int)的私有静态常量变量,并像C++宏一样直接将它们内联到代码中。
然而,我不知道这是否在实践中完成,但为了节省一些内存,这是可以做到的。