11

これまでの検索結果から、これはプライマリー以外のコンストラクターなしでは不可能であると私は信じるようになりました。

class Foo {                      // NOT OK: 2 extra lines--doesn't leverage Scala's conciseness
  private var _x = 0
  def this(x: Int) { this(); _x = x }
  def x = _x
}
val f = new Foo(x = 123)         // OK: named parameter is 'x'

または、プライマリコンストラクターのパラメーターの名前を犠牲にします(名前付きパラメーターを使用して呼び出しを行います)

class Foo(private var _x: Int) { // OK: concise
   def x = _x
}
val f = new Foo(_x = 123)        // NOT OK: named parameter should be 'x' not '_x'

理想的には、次のようなことができます。

class Foo(private var x: Int) {  // OK: concise
    // make just the getter public
    public x
}
val f = new Foo(x = 123)         // OK: named parameter is 'x'

名前付きパラメーターは Java の世界では新しいものであることを知っているので、ほとんどの人にとってはおそらくそれほど重要ではありませんが、名前付きパラメーターがより一般的な言語 (Python) から来ているため、この問題はすぐに発生します。

だから私の質問は:これは可能ですか?(おそらくそうではない)、そうでない場合、なぜそのような (私の意見では) 重要なユースケースが言語設計によって明らかにされたままになっているのでしょうか? つまり、Scala の特徴であるクリーンな名前付けまたは簡潔な定義をコードで犠牲にする必要があるということです。

PSゲッターを公開したまま、パブリックフィールドを突然プライベートにする必要がある場合を考えてみましょう。この場合、開発者は1行を変更して3行を追加し、インターフェースを同一に保ちながら効果を達成する必要があります。

class Foo(var x: Int) {}       // no boilerplate

->

class Foo {                    // lots of boilerplate
  private var _x: Int = 0
  def this(x: Int) { this(); _x = x }
  def x = _x
}
4

2 に答える 2