次のコードがあります。
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
特に、クラスを拡張する独自のシングルトンを作成する機能がユーザーに与えられる場合があります。
できるだけ少ないボイラープレートでこれを行う最良の方法はどれですか?