クラスのインスタンスが 1 つだけ必要なので、クラスの代わりにオブジェクトを使用する必要があります。また、クライアントが選択した初期値を設定する必要があるため、次のようなオブジェクトのコンストラクターが必要です。
object Object1(val initValue: Int){
//.....
}
この正確なコードを Scala で使用することはできません。その場合、どう対処すればよいですか?
クラスのインスタンスが 1 つだけ必要なので、クラスの代わりにオブジェクトを使用する必要があります。また、クライアントが選択した初期値を設定する必要があるため、次のようなオブジェクトのコンストラクターが必要です。
object Object1(val initValue: Int){
//.....
}
この正確なコードを Scala で使用することはできません。その場合、どう対処すればよいですか?
いくつかの選択肢があります。
それをクラスにし、クライアントに構築させ、パラメーターに値を与えます
長所: 不変性
を保持します 短所: 単一のインスタンスしかない場合、管理が難しい場合があります
パラメータの変数をオブジェクトに追加し、setter を追加します。
長所: シングルトンがまだあります 短所
: 現在、変更可能な状態があります
マルチトンを実装する長所
: (明らかな) 不変性とシングルトン (パラメーターごと) を提供します短所:
実装するコードが増えます
次のようなマルチトンを scala で実装できます。
class Object1 private (val initValue: Int) {
// ...
}
object Object1 {
val insts = mutable.Map.empty[Int, Object1]
def apply(initV: Int) =
insts.getOrElseUpdate(initV, new Object1(initV))
}
更新これを「パラメーター付きのシングルトン」に変えることもできます。
object Object1 {
var inst: Option[(Int, Object1)] = None
def apply(initV: Int) = inst match {
case Some((`initV`, i)) => i
case Some(_) =>
sys.error("Object1 already instantiated with different param")
case None =>
val i = new Object1(initV)
inst = Some((initV, i))
i
}
}
オブジェクトは参照するまで作成されないため、次のようなことができます。
object Test1 extends App {
var x = Console.readLine
println(Object1.initVal)
}
object Object1 {
val initVal:String = Test1.x
}