最终和有效最终之间的区别
2022-08-31 04:44:47
我正在Java 8中使用lambdas,我遇到了警告。我知道当我在匿名类中使用变量时,它们必须在外部类中是最终的,但是仍然 - 最终和有效最终之间的区别是什么?local variables referenced from a lambda expression must be final or effectively final
我正在Java 8中使用lambdas,我遇到了警告。我知道当我在匿名类中使用变量时,它们必须在外部类中是最终的,但是仍然 - 最终和有效最终之间的区别是什么?local variables referenced from a lambda expression must be final or effectively final
...从 Java SE 8 开始,局部类可以访问封闭块的局部变量和参数,这些变量和参数是最终的或实际上是最终的。如果变量或参数的值在初始化后永远不会更改,则该变量或参数实际上是最终的。
例如,假设该变量未声明为 final,并且您在构造函数中添加了标记的赋值语句: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 不再是有效的最终值。因此,Java 编译器会生成一条错误消息,类似于“从内部类引用的局部变量必须是最终的或有效的最终变量”,其中内部类 PhoneNumber 尝试访问 numberLength 变量:
http://codeinventions.blogspot.in/2014/07/difference-between-final-and.html
http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html
我发现解释“有效最终”的最简单方法是想象将修饰符添加到变量声明中。如果通过此更改,程序在编译时和运行时继续以相同的方式运行,则该变量实际上是最终变量。final