2015-07-10 116 views
1

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

但是我期待错误

+0

与'-Xcheckinit'你在运行时scala.UninitializedFieldError –

回答

1

当我改变valdeflazy 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已按值呼叫,deflazy val已按名称呼叫。因为A.valueB.value表达式在使用val时被忽略

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 
}