我一直在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
但是我期待錯誤
我一直在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
但是我期待錯誤
當我改變val
到def
或lazy 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
已按值呼叫,def
和lazy val
已按名稱呼叫。因爲A.value
和B.value
表達式在使用val時被忽略
當值具有循環依賴性時,編譯器不會執行任何內聯,而是生成靜態初始化器,初始化將依賴類加載順序來評估表達式。 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
}
與'-Xcheckinit'你在運行時scala.UninitializedFieldError –