Sự khác biệt giữa chúng là, a val
được thực thi khi nó được định nghĩa trong khi a lazy val
được thực thi khi nó được truy cập lần đầu tiên.
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
Ngược lại với một phương thức (được định nghĩa bằng def
) a lazy val
được thực thi một lần và sau đó không bao giờ lặp lại. Điều này có thể hữu ích khi một thao tác mất nhiều thời gian để hoàn thành và khi không chắc chắn liệu nó có được sử dụng sau này hay không.
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
Ở đây, khi các giá trị x
và y
không bao giờ được sử dụng, chỉ x
lãng phí tài nguyên một cách không cần thiết. Nếu chúng ta cho rằng y
không có tác dụng phụ và chúng ta không biết tần suất truy cập (không bao giờ, một lần, hàng nghìn lần) thì việc tuyên bố điều đó là vô ích def
vì chúng ta không muốn thực hiện nó nhiều lần.
Nếu bạn muốn biết làm thế nào lazy vals
được thực hiện, xem câu hỏi này .