の違いは、定義されている場合はval
が実行され、最初にアクセスされた場合はlazy val
が実行されます。 lazy val
を決して再び、次に実行される(def
と定義される)方法とは対照的に
scala> val x = { println("x"); 15 }
x
x: Int = 15
scala> lazy val y = { println("y"); 13 }
y: Int = <lazy>
scala> x
res2: Int = 15
scala> y
y
res3: Int = 13
scala> y
res4: Int = 13
。これは、操作が完了するまでに時間がかかり、後で使用するかどうか不明な場合に役立ちます。ここで
scala> class X { val x = { Thread.sleep(2000); 15 } }
defined class X
scala> class Y { lazy val y = { Thread.sleep(2000); 13 } }
defined class Y
scala> new X
res5: X = [email protected] // we have to wait two seconds to the result
scala> new Y
res6: Y = [email protected] // this appears immediately
、値x
とy
は、唯一x
不必要に無駄にリソースを使用されることはありません。 y
に副作用がなく、アクセス頻度(1回、1回、何千回)がわからない場合、def
と宣言することは無意味です。数回実行したくないからです。
lazy vals
の実装方法については、questionをご覧ください。
補足として:@ViktorKlangはTwitterに投稿しました:["ほとんど知られていないScalaの事実:遅延の初期化が の例外を投げた場合""(https://twitter.com/#!/viktorklang/status/104483846002704384) –