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

时间:2018-03-22 11:00:59

标签: java type-inference java-10

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

如果没有,是否有这样的理由?

3 个答案:

答案 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