2013-02-09 120 views
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參數時,我得到一個NullPointerException,因爲Seq中引用的一個對象實際上是null(打印到控制檯sh那)。也就是說,引用它們的參照物的init比參照它們的其他物體的init更傾向於設定爲null

這是一個有趣的情況。我有一個任意對任意的任意交叉引用,我不知道如何正確地實現初始化,而無需完全將其發佈到外部方法(無論如何,這是一個封裝拆分)。特別是,用戶可能被賦予創建自己的單身人士的能力,擴展SuperClass類。

哪種方法最好的方法是儘可能減少樣板?

+0

[實例化不可變配對對象]的可能重複(http://stackoverflow.com/questions/7507965/instantiating-immutable-paired-objects)。簡而言之:'抽象類SuperClass(cs:=> Seq [SuperClass])' – sschaef 2013-02-09 16:08:32

+0

@sschaef:umm ..你試過了嗎?我無法讓它工作。無論如何,Seq是在通過名稱之前構建的。根據雞蛋的例子,我必須讓Seq在構造時變得懶惰。但是我將它傳遞給構造函數來構造它,所以我不能讓它變得懶惰。而將其定義爲其他地方的懶惰也不會看起來太吸引人......是的,我只是不明白! – noncom 2013-02-10 16:40:15

+0

什麼不適合你?這工作:https://gist.github.com/sschaef/4750334 – sschaef 2013-02-10 17:32:05

回答

1

我想出了以下解決方案。那麼它是Instantiating immutable paired 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 
    } 
} 
+0

那麼,你已經改進了初始化例程..但似乎沒有解決初始化順序問題,據我瞭解,它只是自動初始化..也看到我對sschaef評論原始問題的評論... – noncom 2013-02-10 16:43:05

+0

誰說對象必須按順序初始化?另外 - 是的 - 我的解決方案只會初始化連接到A的那些對象。但這比單獨初始化每個對象更通用一些。你可能也會有一個起點或根對象在應用程序中使用......所以。這取決於整個事情將如何使用。你上面的評論表明你不明白 - 好的... – 2013-02-10 16:56:48