La diferencia entre ellos es que a val
se ejecuta cuando se define, mientras que a lazy val
se ejecuta cuando se accede por primera vez.
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
A diferencia de un método (definido con def
) a lazy val
se ejecuta una vez y luego nunca más. Esto puede ser útil cuando una operación tarda mucho en completarse y cuando no está seguro si se usará más tarde.
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
Aquí, cuando los valores x
y y
nunca se usan, solo se x
desperdician recursos innecesariamente. Si suponemos que y
no tiene efectos secundarios y que no sabemos con qué frecuencia se accede (nunca, una vez, miles de veces), es inútil declararlo def
ya que no queremos ejecutarlo varias veces.
Si desea saber cómo lazy vals
se implementan, consulte esta pregunta .
Lazy<T>
.NET