Scala では、クラスにはメイン コンストラクターが 1 つしかなく、まさに次のように定義しますclass A(text: String) { ... }
。他のすべてのコンストラクターは、最初にそれを呼び出してから、独自の処理を行う必要があります。
クラス本体のすべての式は、メイン コンストラクターの本体として扱われます。したがってprintln(text)
、あなたの場合はメインコンストラクターの本体にあります。最初にコンストラクターを呼び出すとthis()
、実行されてからフィールドを初期化します。def this(text: String)
println
text
私の見解では、メイン コンストラクターは実際のユース ケースのほとんどを満たすことができます (特に、既定の引数と名前付き引数を使用する場合)。それでは、これについて詳しく説明し、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)