局部变量的区别是final
或effectively 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/