2011-11-23 49 views
9

क्या स्काला में def बनाम val का उपयोग कर एक निरंतर, अपरिवर्तनीय मूल्य को परिभाषित करने के निहितार्थ हैं के लिए कर रहे हैं? मैं स्पष्ट रूप से निम्नलिखित लिख सकता हूं:क्या बनाम वैल डीईएफ़ का उपयोग कर के निहितार्थ निरंतर मूल्यों

val x = 3; 
def y = 4; 
var a = x + y; // 7 

उन दो बयानों के बीच क्या अंतर है? कौन सा बेहतर प्रदर्शन करता है/अनुशंसित तरीका/अधिक मूर्खतापूर्ण है? मैं एक दूसरे पर कब उपयोग करूंगा?

उत्तर

9

इन मान लिया जाये कि वर्ग-स्तर घोषणाओं हैं।

def ऑब्जेक्ट इंस्टेंस में मान संग्रहीत नहीं करेगा, इसलिए स्मृति को बचाएगा, लेकिन हर बार मूल्यांकन करने की विधि की आवश्यकता होती है।

दोनों दुनिया का सबसे अच्छा के लिए, एक साथी वस्तु बनाने के लिए और val रों वहाँ के रूप में स्थिरांक की घोषणा।

अर्थात बजाय

class Foo { 
    val MyConstant = 42 
} 

इस:

class Foo {} 

object Foo { 
    val MyConstant = 42 
} 
+0

»बचाने विल स्मृति«? मान को _sewhere__ को संग्रहीत किया जाना है, मुझे नहीं लगता कि एक फॉर्म को दूसरे की तुलना में अधिक स्मृति की आवश्यकता क्यों होगी ...? – knittl

+2

@knittl आप एक हजार उदाहरणों है, एक क्षेत्र एक हज़ार बार संग्रहीत किया जाएगा। एक विधि परिभाषा केवल एक बार संग्रहीत होती है। –

+0

आह ठीक है, यह समझ में आता है! – knittl

1

val एक बार मूल्यांकन किया है और एक क्षेत्र में संग्रहित है। def एक विधि के रूप कार्यान्वित किया जाता है और हर बार पुनः मूल्यांकन किया जाता है, लेकिन स्मृति स्थान का उपयोग नहीं करता है, जिसके परिणामस्वरूप मूल्य स्टोर करने के लिए।

संकलक एक valfinal, जो वीएम से बेहतर अनुकूलित कोड का कारण बन सकता कर देगा: