我在用Java 8玩lambda,遇到警告local variables referenced from a lambda expression must be final or effectively final
。我知道,当我在匿名类中使用变量时,它们必须在外部类中为final
,但仍然-final
和有效的final
之间有什么区别?
..从Java SE 8开始,本地类可以访问最终变量或有效最终变量的局部变量和封闭块的参数。变量或参数的值在初始化后从未更改,实际上是最终的。
例如,假设numberLength
未将变量html" target="_blank">声明为final
,则在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变量: