Sự khác biệt giữa chúng là val
được thực hiện khi được xác định trong khi lazy val
được thực hiện khi đượ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 pháp (được định nghĩa với def
) một lazy val
được thực hiện một lần và sau đó không bao giờ trở lại. Điều này có thể hữu ích khi một hoạt động mất nhiều thời gian để hoàn thành và khi nó không chắc chắn nếu nó được sử dụng sau này.
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 = [email protected] // we have to wait two seconds to the result
scala> new Y
res6: Y = [email protected] // this appears immediately
Ở đây, khi các giá trị x
và y
không bao giờ được sử dụng, chỉ x
nguồn lực lãng phí không cần thiết. Nếu chúng ta giả sử rằng y
không có tác dụng phụ và chúng ta không biết tần suất nó được truy cập (không bao giờ, một lần, hàng nghìn lần) thì vô ích khi khai báo nó là def
vì chúng ta không muốn thực thi nó nhiều lần.
Nếu bạn muốn biết cách lazy vals
được triển khai, hãy xem số question này.
Là một bổ sung: @ViktorKlang đăng trên Twitter: ["Ít được biết đến thực tế Scala: nếu khởi tạo một val lười biếng ném một exce ption, nó sẽ cố gắng reinitialize val tại truy cập tiếp theo. "] (https://twitter.com/#!/viktorklang/status/104483846002704384) –