Java 10 是否提供 val 关键字?如果没有,为什么不呢?

2022-09-01 00:31:54

Java 10 为本地类型推断带来了一个类似 C# 的关键字。var

但是Java 10是否也提供了一个关键字,就像在Scala中找到的那样?val

val会像 工作一样,但绑定将是 。varfinal

var x = "Hello, world. ";
x = "abc"; // allowed

val y = "Hello, world. ";
y = "abc"; // forbidden

如果不是这样,有没有理由认为情况如此?


答案 1

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

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

()


答案 2

因为在Java中有这个。如果我们也有,就会有两件事意味着同样的事情。这并不好。应该只有一种方式来表达一个特定的东西。final varval


推荐