Java 10为local type-inference带来了类似C#的var
关键字。
但是,Java 10还提供val
关键字,found in Scala也是如此?
val
的工作方式与var
类似,但约束力为final
。
var x = "Hello, world. ";
x = "abc"; // allowed
val y = "Hello, world. ";
y = "abc"; // forbidden
如果没有,是否有这样的理由?
答案 0 :(得分:22)
Java 10中没有val
,如JEP 286: Local-Variable Type Inference中所述:
语法选择
对语法有各种各样的看法。这里的两个主要自由度是要使用的关键字(var,auto等),以及是否为不可变的本地(val,let)使用单独的新表单。我们考虑了以下语法选项:
- var x =仅限expr(如C#)
- var,加上不可变本地的val(如Scala,Kotlin)
- var,加上让不可变的本地人(比如Swift)
- auto x = expr(与C ++一样)
- const x = expr(已经是保留字)
- final x = expr(已经是保留字)
- 让x = expr
- def x = expr(如Groovy)
- x:= expr(喜欢Go)
收集大量输入后,var显然优于Groovy,C ++或Go方法。对于不可变的本地人(val,let),第二种句法形式有很多不同的意见;这将是额外获取设计意图的额外仪式的权衡。 最后,我们选择仅支持
var
。关于基本原理的一些细节可以在这里找到。
这是主要推理:
我知道这是人们真正关心的部分:)经过考虑 最好的利弊,似乎有一个明显的赢家 - VAR只。原因包括:
虽然它不是调查中最受欢迎的选择,但确实如此 显然,大多数人都选择了。很多人讨厌 VAR / VAL;其他人讨厌var / let。几乎没有人讨厌var-only。
使用C#的经验 - 只有var - 已经表明这是一个 类似Java语言的合理解决方案。没有任何理由 在C#中对“val”的需求。
当然,减少不变性仪式的愿望 很好,但在这种情况下推动杠杆的错误的一端。 我们需要帮助不可变性的地方是田地,而不是当地人。但 var / val不适用于字段,几乎肯定不会。
如果获得可变性控制的增量开销 类型推断是零,可能有一个更强的情况,但它是 很明显很多人发现两个不同的主要关键词是一个 分散注意力,使他们的眼睛不再快速地重视 东西。如果变量名称比类型更重要,那么它们就更多了 比变异修饰语更重要。
(Source)
答案 1 :(得分:4)
因为Java中有final var
。如果我们也有val
,那么有两件事情意味着相同。这个不好。应该只有一种表达特定事物的方式。
答案 2 :(得分:0)
如果要使用“ val”,即“ final var”,则始终可以使用Lombok's val。