最终和有效最终之间的区别

2022-08-31 04:44:47

我正在Java 8中使用lambdas,我遇到了警告。我知道当我在匿名类中使用变量时,它们必须在外部类中是最终的,但是仍然 - 最终有效最终之间的区别是什么?local variables referenced from a lambda expression must be final or effectively final


答案 1

...从 Java SE 8 开始,局部类可以访问封闭块的局部变量和参数,这些变量和参数是最终的或实际上是最终的。如果变量或参数的值在初始化后永远不会更改,则该变量或参数实际上是最终的。

例如,假设该变量未声明为 final,并且您在构造函数中添加了标记的赋值语句:numberLengthPhoneNumber

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


答案 2

我发现解释“有效最终”的最简单方法是想象将修饰符添加到变量声明中。如果通过此更改,程序在编译时和运行时继续以相同的方式运行,则该变量实际上是最终变量。final


推荐