为什么在Java 8中引入“有效最终”?

时间:2014-11-03 13:47:40

标签: java final

已讨论finaleffectively final的局部变量的差异here。我真的不明白,为什么它是在Java 8中引入的。对我而言,它似乎只是让程序员可以自由地省略final关键字,但有效地将变量视为最终。没有逻辑上的变化,只是懒惰' 程序员的帮助者,不需要写final

难道这甚至是退步,因为现在变量实际上是最终错过了关键字,而不是向代码的读者指出。那么Oracle是否有理由允许在此处省略最终关键字?

1 个答案:

答案 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))