解决Scala中的循环依赖关系

时间:2015-07-10 09:18:45

标签: 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

但我期待一个错误

2 个答案:

答案 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更改为deflazy 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按值调用,deflazy val按姓名调用。因为使用val

时会忽略A.valueB.value个表达式