Perbedaan di antara mereka adalah, bahwa a val
dieksekusi ketika didefinisikan sedangkan a lazy val
dieksekusi ketika diakses pertama kali.
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
Berbeda dengan metode (didefinisikan dengan def
) a lazy val
dieksekusi sekali dan kemudian tidak pernah lagi. Ini bisa bermanfaat ketika operasi membutuhkan waktu lama untuk diselesaikan dan ketika tidak yakin apakah nanti digunakan.
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
Di sini, ketika nilai-nilai x
dan y
tidak pernah digunakan, hanya x
membuang-buang sumber daya yang tidak perlu. Jika kita mengira itu y
tidak memiliki efek samping dan bahwa kita tidak tahu seberapa sering itu diakses (tidak pernah, sekali, ribuan kali) tidak ada gunanya untuk menyatakannya def
karena kita tidak ingin menjalankannya beberapa kali.
Jika Anda ingin tahu bagaimana lazy vals
penerapannya, lihat pertanyaan ini .