1

Scala では、Java の次のコードのようなことをする必要があります。

public class A {
  private String text;  
  public A(String text) {
    this.text = text;
  }
}

Scalaでそれをどのように達成できますか?

を使用できることはわかっていますclass A(text: String) { ... }が、これは非常に単純化された例にすぎず、実際のケースではありません。

私は次のことを試しましたが、常にnullを出力します:

class A {
  var text: String = null
  def this(text: String) = {
    this()
    this.text = text
  }
  println(text)
}

手伝ってくれてありがとう。

4

3 に答える 3

6

Scala では、クラスにはメイン コンストラクターが 1 つしかなく、まさに次のように定義しますclass A(text: String) { ... }。他のすべてのコンストラクターは、最初にそれを呼び出してから、独自の処理を行う必要があります。

クラス本体のすべての式は、メイン コンストラクターの本体として扱われます。したがってprintln(text)、あなたの場合はメインコンストラクターの本体にあります。最初にコンストラクターを呼び出すとthis()、実行されてからフィールドを初期化します。def this(text: String)printlntext


私の見解では、メイン コンストラクターは実際のユース ケースのほとんどを満たすことができます (特に、既定の引数と名前付き引数を使用する場合)。それでは、これについて詳しく説明し、2 番目のものが必要な理由を説明していただけますか? あなたが直面している問題のより良い解決策を見つけることができるかもしれません。


コメントに関する更新

構築時にオプションの引数のセットを提供したい場合は、値Optionの代わりに使用することをお勧めしnullます。Aしたがって、次のようにクラスを実装できます。

class A(val a: Option[String] = None, val b: Option[Int] = None, c: Option[Double] = Some(2.0)) 

new A(b = Some(10))

すべてのフィールドは一定になり、デフォルトがいくつかありますが、一部はカスタマイズできます。たとえば、一部のビジネス ロジックに従って、一部の引数の組み合わせが相互に排他的である可能性もあります。この場合、複数のコンストラクターを使用するのが合理的です。しかし、より良い解決策は、クラスのコンパニオン オブジェクトにいくつかのファクトリ メソッドを作成し、コンストラクターを非公開にすることです。たとえば、クラスのユーザーがaおよびbまたはcのいずれかを提供できる場合、次のように記述できます。

class A private (val a: Option[String] = None, val b: Option[Int] = None, c: Option[Double] = Some(2.0)) 

object A {
    def apply(a: String, b: Int) = new A(Some(a), Some(b))
    def apply(c: Double) = new A(c = Some(c))
}

A("test", 1)
A(11.1)
于 2013-01-29T11:07:03.000 に答える
1
class A {
  var text: String = null
  def this(text: String) = {
    this()
    this.text = text
    println(text)
  }
}

また

class A(text:String=""){
  println(text)
}

また

class A(text:String=null){
  println(text)
}
于 2013-01-29T11:45:21.657 に答える
0

それを行う正しい方法は次のとおりです。

    class A( text : String) {
       def this() = this("") // or null
   }

天使が言ったように、デフォルトのコンストラクターは でA(text : String)あり、他のすべてのコンストラクターは、たとえばthis()最初にそれを呼び出す必要があります。

于 2013-01-29T11:16:40.490 に答える