当我使用lambda表达式或匿名内部类,使用外部类的变量时,我经常会遇到编译时错误:
兰巴表达式:
local variables referenced from a lambda expression must be final or effectively final
内部课程:
local variables referenced from an inner class must be final or effectively final
这意味着Java 8中的编译器能够推断变量是否隐式最终。
关于this问题,使用最终变量而不是非最终变量有时会对绩效产生巨大的积极影响
我的问题是:
java 8中的编译器是否有效地将最终变量解释为最终变量,之后在运行时将其用作最终变量?
因此,它是否与最终变量进行相同的优化?
关于有效的最终决赛和最终决赛(即this)之间的差异的问题与它必须有效最终但没有说出任何能够回答我的问题的原因有关。
我会感激任何答案。
答案 0 :(得分:1)
java 8中的编译器是否有效地将最终变量解释为最终变量,之后在运行时将其用作final?
在这两种情况下答案都是肯定的。
后者的原因是类文件格式没有提供说明局部变量是否声明为final
的方法。因此,如果JIT编译器将基于最终性进行优化,则必须从方法的字节码实际执行的方式推断出最终性;即有效终结。
答案 1 :(得分:0)
"对于这个问题,使用最终变量而不是非最终变量有时会对性能产生巨大的影响。"
如果我理解你所链接的问题,它实际上与"有效的最终"无关。您所指的积极影响是针对实例变量(不是私有的);声明它们final
可能会有所帮助,因为这意味着编译器可以确保子类中的任何方法都不能修改变量。
"有效决赛"是一个仅适用于在方法内声明的 local 变量的概念(包括参数)。方法中的局部变量不可能在子类中修改。
在方法中对局部变量使用final
关键字可能有助于优化,但是一个好的编译器也不需要它。它能够告诉变量没有变化,并相应地进行优化。事实上,即使变量不是final
,但编译器可以告诉它没有针对某段代码进行修改,一个好的编译器应该能够弄清楚它在此期间未发生变化,并根据此进行优化。