java - 为什么 Java 8 中引入了 'effectively final'?

标签 java final

局部变量的区别是finaleffectively final已讨论here 。但我不太明白为什么它在 Java 8 中引入。对我来说,它似乎只是让程序员可以自由地省略 final关键字,但将变量有效地视为最终变量。逻辑没有改变,只是'懒惰'程序员的助手,不需要写 final .

这不是一个后退,因为现在有效的最终变量错过了关键字,没有向代码的读者指示它。那么 Oracle 是否有理由允许在这里省略 Final 关键字?

最佳答案

Java 中的闭包(自版本 1.1 起就存在)只能关闭 final 变量。由于匿名类的语法冗长得无可奈何,所以几个额外的 final 修饰符并不是什么大问题(尽管它们在参数列表中跳到你面前时确实偶尔会让人感到惊讶),但是有了新的简洁lambda 语法,它们是。它们还会导致 lambda 不太无缝地融入代码结构中。特别考虑嵌套 lambda 的情况:

new TreeSet<Integer>((a, b) -> uncheckCall(() -> exceptionThrowingMethod(a, b)))

相比

new TreeSet<Integer>((final Integer a, final Integer b) -> 
     uncheckCall(() -> exceptionThrowingMethod(a, b))

关于java - 为什么 Java 8 中引入了 'effectively final'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26715689/

相关文章:

java - 如何在 Java 中存储值列表并检索详细信息

java - 是什么让不可变对象(immutable对象)在没有安全发布技术的情况下发布?

java - 为什么私有(private)方法也不能是最终的?

java - 如何使用 setter 而不是 final 变量的构造函数?

java - Java 中的泛型类型

java - 向已经很大的类添加大量变量

constructor - 如何在 Kotlin 的构建过程中修改 val 成员

java - 从内部类 : needs to be declared final error java swing 中访问局部变量

java - 在windows 8命令行上编译Junit报错

java - 如何在 Java 中将格式化电子邮件转换为纯文本?