我一直在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 :(得分: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
}
答案 1 :(得分:1)
当我将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
个表达式