Java 10 为本地类型推断带来了一个类似 C# 的var
关键字。
但是 Java 10 是否也提供了一个val
关键字,就像在 Scala 中找到的那样?
val
会工作,var
但绑定会是final
.
var x = "Hello, world. ";
x = "abc"; // allowed
val y = "Hello, world. ";
y = "abc"; // forbidden
如果没有,是否有理由证明这种情况?
Java 10 为本地类型推断带来了一个类似 C# 的var
关键字。
但是 Java 10 是否也提供了一个val
关键字,就像在 Scala 中找到的那样?
val
会工作,var
但绑定会是final
.
var x = "Hello, world. ";
x = "abc"; // allowed
val y = "Hello, world. ";
y = "abc"; // forbidden
如果没有,是否有理由证明这种情况?
Java 10中没有val
,如JEP 286: Local-Variable Type Inference中所述:
语法选择
对语法有不同的看法。这里的两个主要自由度是使用什么关键字(var、auto 等),以及是否为不可变局部变量(val、let)提供单独的新形式。我们考虑了以下句法选项:
- var x = expr only(如 C#)
- var,加上 val 用于不可变的局部变量(如 Scala、Kotlin)
- var,加上 let 用于不可变的局部变量(如 Swift)
- 自动 x = expr(如 C++)
- const x = expr(已经是保留字)
- final x = expr(已经是保留字)
- 让 x = expr
- def x = expr(像 Groovy)
- x := expr (如围棋)
在收集了大量输入之后,var 显然比 Groovy、C++ 或 Go 方法更受欢迎。对于不可变本地人的第二种句法形式(val,let)存在很大的不同意见;这将是额外的仪式以额外捕获设计意图的权衡。最后我们选择了只支持
var
。可以在此处找到有关基本原理的一些详细信息。
这是主要原因:
我知道这是人们真正关心的部分:) 在详细考虑了利弊之后,似乎有一个明显的赢家——仅限 var。原因包括:
虽然它不是调查中最受欢迎的选择,但显然是大多数人都同意的选择。许多人讨厌 var/val;其他人讨厌 var/let。几乎没有人讨厌 var-only。
使用 C#(仅具有 var)的经验表明,在类 Java 语言中这是一个合理的解决方案。在 C# 中没有对“val”的需求。
减少不变性仪式的愿望当然是很好接受的,但在这种情况下,这是推动杠杆的错误一端。我们需要帮助以实现不变性的地方是字段,而不是本地人。但是 var/val 不适用于字段,而且几乎可以肯定永远不会。
如果获取可变性控制相对于类型推断的增量开销为零,则可能会有更强大的情况,但很明显,许多人发现两个不同的主要关键字会分散他们的注意力,从而使他们无法快速关注重要的东西. 如果变量名比类型更重要,那么它们也比可变性修饰符更重要。
(来源)
因为final var
在 Java 中有这样的功能。如果我们也val
有,那么会有两件事意味着相同。情况不妙。应该只有一种方式来表达特定的事物。
如果你想使用“val”,即“final var”,你总是可以使用Lombok 的 val。