我了解 Lazy vals 的一般用途来解决 scala 中的初始化顺序问题,但这种解释一直困扰着我。如果“Lazy Val”在第一次访问期间被初始化,并且父构造函数在它可能存在之前使用它 - 这里到底发生了什么?在下面的示例中,当调用“println("A: " + x1)" 时 - B 类尚不存在......但该值确实可以正确打印。在我们看到“A:Hello”的确切时刻——这是否发生在 A 的构造函数中,或者以某种方式延迟到 B 完全存在?从某种意义上说,将其标记为“懒惰”是否违反直觉使其提前可用?
谢谢
(引用自https://github.com/paulp/scala-faq/wiki/Initialization-Order)
abstract class A {
val x1: String
println("A: " + x1)
}
class B extends A {
lazy val x1: String = "hello"
}