LucKy_one

Always aiming higher


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

JDK8中的effectively final

发表于 2017-04-23
根据JDK8中的effectively final,闭包中访问外部变量不再必须指定为final

However, starting in Java SE 8, a local class can access local variables and parameters of the enclosing block that are final or effectively final. A variable or parameter whose value is never changed after it is initialized is effectively final.
https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html

简单来说,如果只读一个外部变量,不再需要指定成final了。
而在之前,常见的匿名内部类访问外部局部变量必须指定成final。

下面这段代码1.8就可以执行,1.7就会编译报错。

1
2
3
4
5
6
7
8
9
10
public void test(){
int aa = 10;
final int bb = 20;
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(aa+bb);
}
});
}
1.7报错内容:Error:(22, 36) java: 从内部类中访问本地变量aa; 需要被声明为最终类型

当你要修改的外部变量时,在1.8下也会直接报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void test(){
int aa = 10;
final int bb = 20;
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(aa+bb);
}
});

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
aa = 20; //Error
}
});
}
1.8报错内容Error:(34, 17) java: 从内部类引用的本地变量必须是最终变量或实际上的最终变量
(needs to be final or effectively final)
# java
在Spring中使用Junit4测试时访问JNDI资源
2017闲书阅读书目

Liu Tianhe

喜欢金融,喜欢科技
31 日志
29 标签
RSS
GitHub E-Mail
© 2014 – 2022 Liu Tianhe
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Mist v7.3.0