我有以下代碼:對象的交叉引用和初始化順序
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