我已经理解Difference between final and effectively final所解释的“有效最终”意味着什么。
我不明白为什么lambda表达式/烦人的内部类需要使用有效的最终变量?为什么Java 8会放宽变量必须声明为final的限制?
是否只是在变量之前保存final
的输入?或者能够有效使用最终变量的能力还有其他优势吗?
答案 0 :(得分:14)
简单的答案是,由于final
和“有效最终”变量之间没有区别,除了声明中的关键字final
之外,唯一的目的是允许省略final
} keyword。
但这可能比您所知的更具影响力。
对于lambda表达式,参数的整个声明可以简化为x -> x+1
。现在考虑嵌套的lambda表达式,如:x -> y -> x+y
和视觉混乱,如果我们强制在final
参数中添加x
声明,则会创建它。
由于没有Java语法将变量声明为final
而未指定其类型,因此要求规范向该语言添加更复杂的构造,或强制我们添加final
和参数的类型声明,将简单表达式x -> y -> x+y
转换为(final double x) -> y -> x+y
。
主要目标是为Java程序员提供简化(只要在添加新的编程语言功能时可以这样做)。当然,它没有提供语言的任何功能来解决在没有它之前无法解决的问题(这适用于整个lambda特征),但表现力有明显的好处,不仅因为你可以省略{{1修饰符,但它有帮助。它与一起与改进的类型推断,新的编程API,当然还有lambda表达式和方法引用一起工作。
答案 1 :(得分:5)
您可以将此视为在Java中扩展类型推断的范围,以包括推断局部变量的最终性,以便在lambda表达式和内部类中捕获。规则没有改变 - lambda和内部类捕获值而不是变量 - 但是符合规则的语法负担已经减少了。