我有以下代码:
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
,因为Seq
中引用的对象之一实际上是null
(打印到控制台显示)。即,对其init
的调用晚于引用它们的其他对象的init
的对象的引用倾向于设置为null
。
这是一个有趣的情况。我在这里有一个所谓的任意交叉引用,我不知道如何在不将其完全引入外部方法的情况下正确实现初始化(这无论如何都是封装的分解)。特别是用户可以创建自己的扩展SuperClass
类的singleton。
用尽可能少的样板,哪种方法是最好的?
我提出了以下解决方案。这是实例化不可变配对对象的一半重复,但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
}
}