2011年11月13日日曜日

[Scala]値の遅延評価

val定義にlazy修飾子をつけることによって、右辺の初期化処理の実行を遅延させることが出来る。

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