当我使用 lambda 表达式或匿名内部类以及外部类的变量时,我经常会遇到编译时错误:
Lamba 表达式:
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中的编译器能够推断变量是否是隐式final的。
关于this问题,使用最终变量而不是非最终变量有时会对性能产生巨大的积极影响。
我的问题是:
Java 8 中的编译器是否将最终变量有效解释为最终变量,然后在运行时将其用作最终变量?
因此,它是否会进行与最终变量相同的优化?
关于有效最终和最终(即 this )之间差异的问题与它必须是有效最终但没有说出任何回答我的问题的原因有关。
如果有任何答案,我将不胜感激。
最佳答案
Does compiler in java 8 interpret effectively final variables as final variables and later, in runtime use it as final?
这两种情况的答案都是肯定的。
后者的原因是类文件格式没有提供一种方法来说明局部变量是否声明为final
。因此,如果 JIT 编译器要基于最终性进行优化,则必须从方法的字节码实际执行的操作来推断最终性;即有效的最终性。
关于java - Java 8 中的编译器是否将有效的最终变量解释为最终变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40054717/