0

次のコードがあります。

abstract class SuperClass (cs: Seq[C]) {
  def init {}
}

object A extends SuperClass(Seq(B, C))
object B extends SuperClass(Seq(A, D))
object C extends SuperClass(Seq(A, B))
object D extends SuperClass(Seq(C, B, A))
object E extends SuperClass(Seq(B, A, B))

object Initializer {
  def init {
    A.init
    B.init
    C.init
    D.init
    E.init
  }
}

最初に、各オブジェクトには初期化するものがいくつかあるため、私は呼び出します

Initializer.init

そして、プログラムのある時点csで、オブジェクトのパラメーターを使用するとNullPointerException、 で参照されているオブジェクトの 1 つSeqが実際にあるためnull(コンソールに出力すると、それが示されます) が得られます。つまり、それらを参照する他のオブジェクトinitよりも後で呼び出されるオブジェクトへの参照initは、 に設定される傾向がありますnull

これは興味深い状況です。ここには任意の任意の相互参照があると思われますが、外部メソッドに完全に持ち出さずに初期化を適切に実現する方法がわかりません(カプセル化の内訳です)。SuperClass特に、クラスを拡張する独自のシングルトンを作成する機能がユーザーに与えられる場合があります。

できるだけ少ないボイラープレートでこれを行う最良の方法はどれですか?

4

1 に答える 1

1

私は次の解決策を思いついた。不変のペアオブジェクトのインスタンス化の半分の複製ですが、Seqによって定義された依存関係は追加の次元です。

abstract class SuperClass (cs: => Seq[SuperClass]) {
  SuperClass.collected += this
  def init {}
}
object SuperClass {
  private val collected = ListBuffer[SuperClass]()
  def init = collected.foreach(_.init)
}
object Initializer {
  def init {
    A // access the root object
    SuperClass.init // call init on all automatically created dependent objects
  }
}
于 2013-02-09T20:39:17.677 に答える