web-dev-qa-db-ja.com

Java 10はvalキーワードを提供しますか?そうでない場合、なぜ提供しないのですか?

Java 10は、C#のようなvarキーワードを ローカル型推論 にもたらします。

しかし、Java 10はvalキーワードも提供します Scalaにあります

valvarと同様に機能しますが、バインディングはfinalになります。

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

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

そうでない場合、これが事実である理由はありますか?

20
sdgfsdh

Java 10、 JEP 286:Local-Variable Type Inference :に記載されているように、valはありません。

構文の選択肢

構文については多様な意見がありました。ここでの2つの主な自由度は、使用するキーワード(var、autoなど)と、不変のローカル用に別の新しい形式を使用するかどうか(val、let)です。次の構文オプションを検討しました。

  • var x = exprのみ(C#など)
  • var、および不変のローカル(val、Scala、Kotlinなど)の場合はval
  • var、さらに不変のローカル(Swiftなど)
  • auto x = expr(C++など)
  • const x = expr(既に予約語)
  • final x = expr(すでに予約語)
  • let x = expr
  • def x = expr(Groovyなど)
  • x:= expr(Goなど)

かなりの入力を収集した後、varはGroovy、C++、またはGoアプローチよりも明らかに好まれました。不変のローカル(val、let)の2番目の構文形式については、意見の実質的な多様性がありました。これは、設計意図をさらに補足するための追加式のトレードオフになります。 最後に、varのみをサポートすることにしました。理論的根拠の詳細はここにあります。

主な理由は次のとおりです。

これは人々が本当に気にかけている部分だと思います:)長所で長所と短所を検討した後、明らかな勝者がいるようです-varのみ。この理由は次のとおりです。

  • これは調査で最も一般的な選択肢ではありませんでしたが、ほとんどの人が大丈夫な選択肢であることは明らかです。多くの人がvar/valを嫌っていました。他の人はvar/letを嫌っていました。 var-onlyを嫌う人はほとんどいません。

  • Varのみを持つC#の経験は、これがJavaに似た言語の合理的なソリューションであることを示しています。 C#には「val」に対する需要のうねりはありません。

  • 不変性の儀式を減らしたいという願望は確かに十分に取られていますが、この場合、レバーの間違った端を押しています。不変性の助けが必要なのは、ローカルではなくフィールドです。ただし、var/valはフィールドには適用されず、ほとんど確実に適用されません。

  • 型推論の可変性制御の増分オーバーヘッドがゼロの場合、より強力なケースがあるかもしれませんが、多くの人々が2つの異なる主要なキーワードが気を散らすものであり、目が重要なものに素早く収まらないことを発見したことは明らかでした。変数名が型よりも重要である場合、可変性修飾子よりも重要です。

ソース

24
Eran

Javaにはfinal varがあるので。 valもある場合、同じことを意味する2つのことがあります。これは良くない。特定のことを表現する方法は1つしかありません。

6
ZhekaKozlov