ความแตกต่างระหว่างพวกเขาคือที่val
จะดำเนินการเมื่อมีการกำหนดในขณะที่lazy val
จะดำเนินการเมื่อมีการเข้าถึงในครั้งแรก
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
ในทางตรงกันข้ามกับวิธีการ (นิยามด้วยdef
) a lazy val
จะถูกดำเนินการเพียงครั้งเดียวแล้วจะไม่มีอีกต่อไป สิ่งนี้มีประโยชน์เมื่อการดำเนินการใช้เวลานานกว่าจะเสร็จสมบูรณ์และไม่แน่ใจว่าจะใช้ในภายหลังหรือไม่
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
ที่นี่เมื่อค่าx
และy
ไม่เคยใช้เพียงx
เสียทรัพยากรโดยไม่จำเป็น หากเราคิดว่าy
ไม่มีผลข้างเคียงและเราไม่ทราบว่ามีการเข้าถึงบ่อยแค่ไหน (ไม่เคยครั้งพันครั้ง) ก็ไม่มีประโยชน์ที่จะประกาศdef
เนื่องจากไม่มีการเรียกใช้หลายครั้ง
หากคุณต้องการทราบวิธีlazy vals
การใช้งานให้ดูคำถามนี้