JavaFinal与EffectivelyFinal-创新互联
1. 介绍
Java 8 引入的众多功能中,其中一个最有趣的功能是 effectively final。即不用 final 修饰符也能达到同样的效果。
本文将介绍该功能的起源以及编译器处理 effectively final 与 final 关键字的不同之处。此外,还会通过一个 effectively final 变量的问题案例给出解决方案。
2. Effectively Final 的起源
简而言之,如果对象或基础类型的变量在初始化后值不发生改变,则可以把它们看做 effectively final。只要不改变对象引用,即使引用的对象发生状态改变,该对象也是 effectively final。
在 Java 引入该功能之前,不能在匿名类中使用非 final 局部变量。此外,也不能在匿名类、内部类和 lambda 表达式中多次赋值。新功能的加入节省了为 effectively final 变量输入 final 关键字的工作。
匿名类是一种内部类,不能访问非 final 变量或 effectively final 变量,也无法按照 JLS 8.1.3 的规定在其封闭作用域内的变量进行修改。lambda 表达式也有类似的限制,修改变量可能会带来并发问题。
docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.3
3. Final vs Effectively Final
要确认一个 final 变量是不是 effectively final,最简单的办法就是删除 final 关键字看能否编译并运行:
![Java Final与Effectively Final](/upload/otherpic37/19955698-24f5a46b8eb3f0ff.png?imageMogr2/auto-orient/strip)
分享题目:JavaFinal与EffectivelyFinal-创新互联
新闻来源:http://tyjierui.cn/article/ddehjo.html