我有以下代码:对象的交叉引用和初始化顺序
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
(打印到控制台sh那)。也就是说,引用它们的参照物的init
比参照它们的其他物体的init
更倾向于设定为null
。
这是一个有趣的情况。我有一个任意对任意的任意交叉引用,我不知道如何正确地实现初始化,而无需完全将其发布到外部方法(无论如何,这是一个封装拆分)。特别是,用户可能被赋予创建自己的单身人士的能力,扩展SuperClass
类。
哪种方法最好的方法是尽可能减少样板?
[实例化不可变配对对象]的可能重复(http://stackoverflow.com/questions/7507965/instantiating-immutable-paired-objects)。简而言之:'抽象类SuperClass(cs:=> Seq [SuperClass])' – sschaef 2013-02-09 16:08:32
@sschaef:umm ..你试过了吗?我无法让它工作。无论如何,Seq是在通过名称之前构建的。根据鸡蛋的例子,我必须让Seq在构造时变得懒惰。但是我将它传递给构造函数来构造它,所以我不能让它变得懒惰。而将其定义为其他地方的懒惰也不会看起来太吸引人......是的,我只是不明白! – noncom 2013-02-10 16:40:15
什么不适合你?这工作:https://gist.github.com/sschaef/4750334 – sschaef 2013-02-10 17:32:05