11

クラスのインスタンスが 1 つだけ必要なので、クラスの代わりにオブジェクトを使用する必要があります。また、クライアントが選択した初期値を設定する必要があるため、次のようなオブジェクトのコンストラクターが必要です。

object Object1(val initValue: Int){
  //.....
}

この正確なコードを Scala で使用することはできません。その場合、どう対処すればよいですか?

4

2 に答える 2

19

いくつかの選択肢があります。

  1. それをクラスにし、クライアントに構築させ、パラメーターに値を与えます
    長所: 不変性
    を保持します 短所: 単一のインスタンスしかない場合、管理が難しい場合があります

  2. パラメータの変数をオブジェクトに追加し、setter を追加します。
    長所: シングルトンがまだあります 短所
    : 現在、変更可能な状態があります

  3. マルチトンを実装する長所
    : (明らかな) 不変性とシングルトン (パラメーターごと) を提供します短所:
    実装するコードが増えます

次のようなマルチトンを 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
  }
}
于 2013-06-03T16:51:33.913 に答える
5

オブジェクトは参照するまで作成されないため、次のようなことができます。

object Test1 extends App {
  var x = Console.readLine
  println(Object1.initVal)
}

object Object1 {
  val initVal:String = Test1.x
}
于 2013-06-03T17:07:43.263 に答える