Java8新特性:Effectively final
Java 8引入了一个新的特性称为"Effectively final"(实际上是final)。它允许在Lambda表达式或匿名内部类中访问并且使用非final变量,只要这些变量在使用前没有被修改。
在Java 7以前,Lambda表达式或匿名内部类只能访问和使用final变量。这是因为匿名内部类的实例可能会在创建后被延迟执行,而在其执行时变量可能已经被修改。为了解决这个问题,Java 8引入了Effectively final的概念。
Effectively final变量是指在初始化之后没有再次被修改的变量。换句话说,一旦变量被赋值后,在后续代码中不允许再修改其值。这样,Lambda表达式或匿名内部类就可以访问和使用这些变量,而不需要将它们声明为final。
下面是一个使用Effectively final变量的例子:
public static void main(String[] args) {
String name = "John";
int age = 30;
// Lambda表达式访问Effectively final变量
Greeting greeting = () -> System.out.println("Hello " + name + "! You are " + age + " years old.");
greeting.sayHello();
}
interface Greeting {
void sayHello();
}
在上面的例子中,变量name
和age
被Lambda表达式访问和使用。尽管它们不是final变量,但它们在使用之前没有被修改,因此它们被视为Effectively final变量。
注意,一旦Effectively final变量被同一个作用域内的Lambda表达式或匿名内部类使用,就不能再对其进行修改。否则,编译器将会报错。这是因为在使用Effectively final变量时,编译器会生成一个隐含的final变量的副本,以确保它们在执行时的值不会被修改。