Java8的final和effectively final

在Java8之前,也就是Java没有lambda之前,在内部类内使用外部类的变量时,必须将变量置为final。

在有了lambda之后,对于在labmda函数内使用的外部变量的要求变松了,可以是“final”或者“有效的final”。有效的final意思是这个变量虽然没有显式的声明为final,但是实际上确实没有变更,编译就允许通过。示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//可编译通过
for (int i = 0; i < 10; i++) {
int counter = i;
new Thread(() -> {
System.out.println("i = " + counter);
}).start();
}

//编译不通过
for (int i = 0; i < 10; i++) {
int counter = i;
new Thread(() -> {
System.out.println("i = " + counter);
}).start();
counter++; //不通过是因为这里
}

感谢