lazyなvalは、初めてその変数にアクセスが行われたときに初期化(右辺の初期化式の実行)が行われる。
2度目にアクセスした時には、既に初期化されているので初期化は行われない。
サンプルコード
object Hoge {
val hoge = {
println("init hoge")
"hoge"
}
lazy val lazyHoge = {
println("init lazyHoge")
"lazyHoge"
}
def main(args: Array[String]) {
println(Hoge)
println("========== hoge ==========")
println(Hoge.hoge)
println("========== lazy hoge ==========")
println(Hoge.lazyHoge)
println("========== lazy hoge2 ==========")
println(Hoge.lazyHoge)
}
}
実行結果
以下の点を確認出来る。- 通常のvalは、クラス参照時に初期化されていることがわかる
- lazyなvalは、その変数に初回にアクセスしたときに初期化されていることがわかる
init hoge Hoge ========== hoge ========== hoge ========== lazy hoge ========== init lazyHoge lazyHoge ========== lazy hoge2 ========== lazyHoge