Java8的final和effectively final

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

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

//可编译通过
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++; //不通过是因为这里
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注