उनके बीच का अंतर यह है कि 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
के साथ परिभाषित) एक
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 = [email protected] // we have to wait two seconds to the result
scala> new Y
res6: Y = [email protected] // this appears immediately
यहाँ, जब मान x
और y
इस्तेमाल कभी नहीं कर रहे हैं, केवल x
अनावश्यक रूप से बर्बाद कर संसाधनों। अगर हमें लगता है कि y
का कोई दुष्प्रभाव नहीं है और हम नहीं जानते कि इसे कितनी बार एक्सेस किया जाता है (कभी नहीं, कभी-कभी, हजारों बार) इसे def
के रूप में घोषित करना बेकार है क्योंकि हम इसे कई बार निष्पादित नहीं करना चाहते हैं।
यदि आप जानना चाहते हैं कि lazy vals
लागू किए गए हैं, तो यह question देखें।
एक पूरक के रूप में: @ViktorKlang ट्विटर पर पोस्ट किया गया: ["छोटे ज्ञात स्कैला तथ्य: यदि आलसी वैल की शुरुआत एक exce फेंकता है पशन, यह अगले पहुंच पर वैल को फिर से शुरू करने का प्रयास करेगा। "] (https://twitter.com/#!/viktorklang/status/104483846002704384) –