44

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

如果没有,是否有理由证明这种情况?

4

3 回答 3

53

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 不适用于字段,而且几乎可以肯定永远不会。

  • 如果获取可变性控制相对于类型推断的增量开销为零,则可能会有更强大的情况,但很明显,许多人发现两个不同的主要关键字会分散他们的注意力,从而使他们无法快速关注重要的东西. 如果变量名比类型更重要,那么它们也比可变性修饰符更重要。

来源

于 2018-03-22T11:22:12.353 回答
8

因为final var在 Java 中有这样的功能。如果我们也val有,那么会有两件事意味着相同。情况不妙。应该只有一种方式来表达特定的事物。

于 2018-05-26T15:20:13.697 回答
7

如果你想使用“val”,即“final var”,你总是可以使用Lombok 的 val

于 2019-11-26T13:15:37.727 回答