Java 8 中编译器是否将有效最终变量解释为最终变量?
Are the effectively final variables interpreted as final by compiler in Java 8?
当我使用 lambda 表达式或匿名内部 classes,以及来自外部 class 的变量时,我经常遇到编译时错误:
兰巴表达式:
local variables referenced from a lambda expression must be final or effectively final
内classes:
local variables referenced from an inner class must be final or effectively final
这意味着 Java 8 中的编译器能够推断出变量是否隐式最终。
关于 this 问题,使用最终变量而不是非最终变量有时会对性能产生巨大的积极影响。
我的问题是:
java8 中的编译器是否有效地将 final 变量解释为 final 变量,然后在运行时将其用作 final?
因此,它是否进行了与最终变量相同的优化?
关于 effective final 和 final(即 this)之间差异的问题与它必须是 effective final 的原因有关,但没有说明任何可以回答我问题的内容。
如有任何答案,我将不胜感激。
Does compiler in java 8 interpret effectively final variables as final variables and later, in runtime use it as final?
两种情况的答案都是肯定的。
后者的原因是 class 文件格式没有提供一种方法来说明局部变量是否声明为 final
。因此,如果 JIT 编译器要根据最终性进行优化,则必须从方法的字节码实际执行的操作中推断出最终性;即有效的最终确定性。
"Regarding to this question, using final variables instead of non-final sometimes gives a huge possitive impact on performance."
如果我理解正确,你链接到的问题,它确实与 "effectively final" 无关。您所指的积极影响是针对 instance 变量(非私有变量);声明它们 final
可能会有帮助,因为这意味着编译器可以确保子类中的任何方法都不能修改变量。
"Effectively final" 是一个概念,仅适用于在方法内部声明的 local 变量(包括参数)。不可能在子类中修改方法中的局部变量。
在方法中对局部变量使用 final
关键字可能有助于优化,但好的编译器不需要它。它能够判断出变量没有改变,并相应地进行优化。事实上,即使变量不是 final
,但编译器可以判断它没有针对某段代码进行修改,一个好的编译器应该能够弄清楚它没有被改变在此期间,并在此基础上进行优化。
当我使用 lambda 表达式或匿名内部 classes,以及来自外部 class 的变量时,我经常遇到编译时错误:
兰巴表达式:
local variables referenced from a lambda expression must be final or effectively final
内classes:
local variables referenced from an inner class must be final or effectively final
这意味着 Java 8 中的编译器能够推断出变量是否隐式最终。
关于 this 问题,使用最终变量而不是非最终变量有时会对性能产生巨大的积极影响。
我的问题是:
java8 中的编译器是否有效地将 final 变量解释为 final 变量,然后在运行时将其用作 final?
因此,它是否进行了与最终变量相同的优化?
关于 effective final 和 final(即 this)之间差异的问题与它必须是 effective final 的原因有关,但没有说明任何可以回答我问题的内容。
如有任何答案,我将不胜感激。
Does compiler in java 8 interpret effectively final variables as final variables and later, in runtime use it as final?
两种情况的答案都是肯定的。
后者的原因是 class 文件格式没有提供一种方法来说明局部变量是否声明为 final
。因此,如果 JIT 编译器要根据最终性进行优化,则必须从方法的字节码实际执行的操作中推断出最终性;即有效的最终确定性。
"Regarding to this question, using final variables instead of non-final sometimes gives a huge possitive impact on performance."
如果我理解正确,你链接到的问题,它确实与 "effectively final" 无关。您所指的积极影响是针对 instance 变量(非私有变量);声明它们 final
可能会有帮助,因为这意味着编译器可以确保子类中的任何方法都不能修改变量。
"Effectively final" 是一个概念,仅适用于在方法内部声明的 local 变量(包括参数)。不可能在子类中修改方法中的局部变量。
在方法中对局部变量使用 final
关键字可能有助于优化,但好的编译器不需要它。它能够判断出变量没有改变,并相应地进行优化。事实上,即使变量不是 final
,但编译器可以判断它没有针对某段代码进行修改,一个好的编译器应该能够弄清楚它没有被改变在此期间,并在此基础上进行优化。