Scala中循环依赖的解析
我一直在Scala中试验循环依赖性杀虫剂Scala中循环依赖的解析,scala,initialization,Scala,Initialization,我一直在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时,我预期会出现一个错误,正如我最初预期的那样,它会导致堆栈溢出 Exceptio
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)
我猜,它与求值类型有关,其中
val
具有按值调用,而def
和lazy val
具有按名称调用。由于当值具有循环依赖关系时,使用val时会忽略A.value
和B.value
表达式,因此编译器不会进行任何内联,而是生成静态初始化器,初始化将依赖于类加载顺序来计算表达式。
为了更清楚,尝试加法而不是乘法
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.uninitializedFeldError。是否存在导致死锁的循环初始化问题?