Java 8 引入的众多功能中,其中一个最有趣的功能是 effectively final。即不用 final 修饰符也能达到同样的效果。
本文将介绍该功能的起源以及编译器处理 effectively final 与 final 关键字的不同之处。此外,还会通过一个 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
要确认一个 final 变量是不是 effectively final,最简单的办法就是删除 final 关键字看能否编译并运行:
本文题目:JavaFinal与EffectivelyFinal-创新互联
当前链接:https://www.cdcxhl.com/article20/ddehjo.html
成都网站建设公司_创新互联,为您提供外贸建站、建站公司、网站导航、网站收录、电子商务、App设计
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联