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对象的参数时,我得到 aNullPointerException因为其中引用的对象之一Seq确实是null(打印到控制台显示)。即对对象的引用init比引用它们的其他对象的调用晚init,往往被设置为null

这是一个有趣的情况。我在这里有一个所谓的任意交叉引用,我不知道如何正确实现初始化而不将其完全引入外部方法(无论如何这都是封装的分解)。尤其是用户可能被赋予创建他们自己的单例扩展SuperClass类的能力。

用尽可能少的样板来做到这一点的最佳方法是什么?

4

1 回答 1

1

我想出了以下解决方案。好吧,它是Instantiating immutable pair objects的一半副本,但是 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 回答