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
そうでない場合、これが事実である理由はありますか?
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つの異なる主要なキーワードが気を散らすものであり、目が重要なものに素早く収まらないことを発見したことは明らかでした。変数名が型よりも重要である場合、可変性修飾子よりも重要です。
( ソース )
Javaにはfinal var
があるので。 val
もある場合、同じことを意味する2つのことがあります。これは良くない。特定のことを表現する方法は1つしかありません。