已讨论final
或effectively final
的局部变量的差异here。我真的不明白,为什么它是在Java 8中引入的。对我而言,它似乎只是让程序员可以自由地省略final
关键字,但有效地将变量视为最终。没有逻辑上的变化,只是懒惰' 程序员的帮助者,不需要写final
。
难道这甚至是退步,因为现在变量实际上是最终错过了关键字,而不是向代码的读者指出。那么Oracle是否有理由允许在此处省略最终关键字?
答案 0 :(得分:4)
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))