Java 10 是否提供 val 关键字?如果没有,为什么不呢?
2022-09-01 00:31:54
Java 10 中没有,如 JEP 286:局部变量类型推断中所述:val
语法选择
关于语法有不同的意见。这里的两个主要自由度是要使用的关键字(var,auto等),以及是否为不可变局部变量(val,let)提供单独的新形式。我们考虑了以下语法选项:
- var x = 仅 expr(如 C#)
- var, plus val for immutable locals (like Scala, Kotlin)
- var, plus let for immutable locals (比如 Swift)
- auto x = expr (像 C++)
- const x = expr(已经是一个保留字)
- final x = expr(已经是一个保留字)
- 设 x = expr
- def x = expr (像 Groovy)
- x := expr (like Go)
在收集了大量意见后,var显然比Groovy,C++或Go方法更受欢迎。对于不可变的本地人(val,let)的第二种句法形式,意见存在很大差异;这将是额外仪式的权衡,以额外捕获设计意图。最后,我们选择只支持
var
。有关基本原理的一些细节可以在这里找到。
这是主要原因:
我知道这是人们真正关心:)在详细考虑了利弊之后,似乎有一个明显的赢家 - 只有var。原因包括:
虽然这不是调查中最受欢迎的选择,但显然是大多数人都同意的选择。许多人讨厌var/val;其他人讨厌var/let。几乎没有人讨厌var-only。
C#的经验 - 只有var - 表明这在类Java语言中是一个合理的解决方案。在 C# 中没有对“val”的需求激增。
减少不变性仪式的愿望当然是很好的,但在这种情况下,正在推动杠杆的错误一端。我们需要不可变性帮助的地方是字段,而不是局部变量。但是var/val并不适用于字段,而且几乎肯定永远不会。
如果获得可变性控制类型推断的增量开销为零,则可能有更强的情况,但很明显,许多人发现两个不同的前导关键字会分散注意力,使他们的眼睛无法快速确定重要的东西。如果变量名称比类型更重要,那么它们也比可变性修饰符更重要。
(源)
因为在Java中有这个。如果我们也有,就会有两件事意味着同样的事情。这并不好。应该只有一种方式来表达一个特定的东西。final var
val