編集-これは、私がここで複製されたと思ったscalaメーリングリストの質問からのものです。私の答えは、3つの異なるコンストラクターを提供すること(つまり、Java設計を複製すること)に関連しており、クラスを拡張しないことに関するものです。
各コンストラクターが最終的にオブジェクトの状態 を作成すると仮定して、S
この状態を作成するための「静的」メソッドを使用してコンパニオンオブジェクトを作成します
object Base {
private def stateFrom(d : Double) : S = error("TODO")
private def stateFrom(s : Str) : S = error("TODO")
private def stateFrom(i : Int) : S = error("TODO")
}
次に、プライマリコンストラクターに従う状態および(パブリック)オーバーロードされたコンストラクターを取得するプライベートコンストラクターを作成します
import Base._
class Base private(s : S) { //private constructor takes the state
def this(d : Double) = this(stateFrom(d))
def this(str : String) = this(stateFrom(str))
def this(i : Int) = this(stateFrom(i))
//etc
}