我正在使用 Java 8 中的 lambdas,但遇到了警告local variables referenced from a lambda expression must be final or effectively final。我知道当我在匿名类中使用变量时,它们在外部类中必须是 final 的,但是仍然 - final 和 有效 final 之间有什么区别?
local variables referenced from a lambda expression must be final or effectively final
…从 Java SE 8 开始,本地类可以访问最终或有效最终的封闭块的局部变量和参数。 一个变量或参数,其值在初始化后永远不会改变,它实际上是最终的。
例如,假设变量numberLength未声明为 final,并且您在PhoneNumber构造函数中添加了标记的赋值语句:
numberLength
PhoneNumber
public class OutterClass { int numberLength; // <== not *final* class PhoneNumber { PhoneNumber(String phoneNumber) { numberLength = 7; // <== assignment to numberLength String currentNumber = phoneNumber.replaceAll( regularExpression, ""); if (currentNumber.length() == numberLength) formattedPhoneNumber = currentNumber; else formattedPhoneNumber = null; } ... } ... }
由于这个赋值语句,变量 numberLength 不再是有效的 final 了。 结果,Java 编译器生成类似于“从内部类引用的局部变量必须是最终或有效最终”的错误消息, 其中内部类 PhoneNumber 尝试访问 numberLength 变量:
http://codeinventions.blogspot.in/2014/07/difference-between-final- and.html
http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html