“最终有效”(effectively final)

82 阅读2分钟

在 Java 中,“有效最终”(effectively final)是指一个局部变量在初始化之后没有被修改,即使它没有被显式地用 final 关键字声明为最终变量。

什么是“有效最终”?

一个变量被称为“有效最终”的,如果它在初始化后没有被重新赋值。这样的变量可以被 lambda 表达式或匿名类捕获和使用。

为什么需要“有效最终”?

Java 的 lambda 表达式和匿名类需要捕获的局部变量是“有效最终”的,以保证线程安全和数据一致性。因为 lambda 表达式和匿名类可能在不同的线程中执行,确保这些变量的不可变性有助于避免并发修改带来的问题。

示例

以下是一个“有效最终”变量的示例:

public class EffectivelyFinalExample {
    public static void main(String[] args) {
        int num = 10; // num 是有效最终的,因为它在后续没有被修改

        Runnable runnable = () -> System.out.println(num);
        runnable.run(); // 输出: 10
    }
}

在这个示例中,num 是有效最终的,因为在初始化之后没有被修改。

非“有效最终”示例

如果尝试修改一个捕获的局部变量,Java 编译器将会报错:

public class NotEffectivelyFinalExample {
    public static void main(String[] args) {
        int num = 10;
        
        // 尝试修改 num
        num = 15; // 这将导致编译错误

        Runnable runnable = () -> System.out.println(num);
        runnable.run();
    }
}

在这个示例中,num 被重新赋值,因此它不是有效最终的,导致编译错误。

结论

“有效最终”是 Java 中一个重要的概念,尤其是在使用 lambda 表达式和匿名类时。它确保了捕获的局部变量在多线程环境中的安全性和一致性。因此,在设计和实现代码时,应注意保持捕获变量的有效最终性。