2011-09-21 139 views
25

是否可以創建一個具有對夥伴對象的不可變引用的類,還是必須是在創建後分配的var實例化不可變配對對象

例如

class PairedObject (p: PairedObject, id: String) { 
    val partner: PairedObject = p // but I need ref to this object to create p! 
} 

或類似如何實例化下面的對?

class Chicken (e: Egg) { 
    val offspring = e 
} 

class Egg (c: Chicken) { 
    val mother = c 
} 

回答

25

這裏是一個完整的解決方案,以雞/蛋的問題:

class Chicken (e: =>Egg) { 
    lazy val offspring = e 
} 

class Egg (c: =>Chicken) { 
    lazy val mother = c 
} 

lazy val chicken: Chicken = new Chicken(egg) 
lazy val egg: Egg   = new Egg(chicken) 

請注意,您必須提供明確的類型的chickenegg變量。

而對於PairedObject:

class PairedObject (p: => PairedObject, val id: String) { 
    lazy val partner: PairedObject = p 
} 

lazy val p1: PairedObject = new PairedObject(p2, "P1") 
lazy val p2: PairedObject = new PairedObject(p1, "P2") 
+0

巧妙!測試...作品 –

+0

我也爲PairedObject添加了解決方案。另外我發現'雞肉'和'雞蛋'不需要懶惰。嚴格地說,你不需要爲兩者都包括類型,因爲可以推斷出這兩種類型。 –

+9

如果在'class'或'object'定義的頂層輸入此解決方案,但如果'chicken'和'egg'是局部變量(例如,函數內部),則會得到非法的前向引用錯誤。一個適用於任何範圍的解決方案是:'lazy val(egg:egg,chicken:chicken)= ...',它可以是自引用的。 –