2015-07-10 73 views
1

我一直在Scala中試驗循環依賴關係。解決Scala中的循環依賴關係

object A { 
    val value:Int = 5 * B.value 
} 

object B { 
    val value:Int = 3 * A.value 
} 

object Main extends App{ 
    println(A.value) 
    println(B.value) 
} 

執行結果與

0 
0 

但是我期待錯誤

+0

與'-Xcheckinit'你在運行時scala.UninitializedFieldError –

回答

1

當我改變valdeflazy val它導致堆棧溢出,因爲我期待最初

Exception in thread "main" java.lang.StackOverflowError 
    at com.experiments.A$.value(Experiments.scala:8) 
    at com.experiments.B$.value(Experiments.scala:12) 
    at com.experiments.A$.value(Experiments.scala:8) 
    at com.experiments.B$.value(Experiments.scala:12) 

我想,這與評估有關n類型,其中val已按值呼叫,deflazy val已按名稱呼叫。因爲A.valueB.value表達式在使用val時被忽略

2

當值具有循環依賴性時,編譯器不會執行任何內聯,而是生成靜態初始化器,初始化將依賴類加載順序來評估表達式。 Check this out。 爲了使它更清楚,嘗試添加而不是乘法。

object A { 
    val value:Int = 5 + B.value 
} 

object B { 
    val value:Int = 3 + A.value 
} 

object Main extends App{ 

    println("A= "+A.value) // 8 
    println("B = "+B.value) // 3 
} 

但如果換成調用的結果將是

object Main extends App{ 

    println("B= "+B.value) // 8 
    println("A = "+A.value) // 5 
}