簡體   English   中英

對象交叉引用和初始化順序

[英]object cross-references and initialization order

我有以下代碼:

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 (打印到控制台上表明了這一點)。 即,對具有其init調用晚於引用它們的其他對象的init的對象的引用,往往會設置為null

這是一個有趣的情況。 我在這里有一個所謂的“任意對任意”交叉引用,而且我不知道如何在不將其完全引入外部方法的情況下正確實現初始化(無論如何這都是封裝的分解)。 特別是可以使用戶能夠創建自己的擴展SuperClass類的單例。

盡可能減少樣板的最佳方法是哪一種?

我想出了以下解決方案。 好吧,它是實例化不可變配對對象的一半,但是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
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM