我一直在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 –