Der Unterschied zwischen ihnen besteht darin, dass a val
ausgeführt wird, wenn es definiert ist, während a lazy val
ausgeführt wird, wenn beim ersten Zugriff darauf zugegriffen wird.
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
Im Gegensatz zu einer Methode (definiert mit def
) lazy val
wird a einmal und dann nie wieder ausgeführt. Dies kann nützlich sein, wenn ein Vorgang lange dauert und nicht sicher ist, ob er später verwendet wird.
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 = X@262505b7 // we have to wait two seconds to the result
scala> new Y
res6: Y = Y@1555bd22 // this appears immediately
Hier werden, wenn die Werte x
und y
nie verwendet werden, nur x
unnötig Ressourcen verschwendet. Wenn wir annehmen, dass dies y
keine Nebenwirkungen hat und wir nicht wissen, wie oft darauf zugegriffen wird (niemals, einmal, tausende Male), ist es sinnlos, dies als zu deklarieren, def
da wir es nicht mehrmals ausführen möchten.
Wenn Sie wissen möchten, wie sie lazy vals
implementiert werden, lesen Sie diese Frage .