私は、scala での初期化順序の問題を回避するために Lazy val を一般的に使用することは理解していますが、この説明についてはいつも何かに悩まされてきました。「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"
}