2013-09-04 12 views
19

वैल/var के बिना एक निजी var कन्स्ट्रक्टर पैरामीटर और कन्स्ट्रक्टर पैरामीटर के बीच क्या अंतर है? क्या वे दायरे/दृश्यता के मामले में समान हैं?स्कैला कन्स्ट्रक्टर पैरामीटर्स

पूर्व:

class Person(private var firstName:String, lastName:String) 
+0

इस प्रश्न को देखें: http://stackoverflow.com/questions/15639078/scala-class-constructor-parameters – danielkza

+0

इसमें एक बेहतर स्पष्टीकरण है: http://stackoverflow.com/questions/14694712/do-scala- कन्स्ट्रक्टर-पैरामीटर-डिफॉल्ट-टू-प्राइवेट-वैल – lcn

उत्तर

24

हाँ, वहाँ दो महत्वपूर्ण मतभेद हैं। पहले आसान के लिए: var या val कीवर्ड के बिना कन्स्ट्रक्टर पैरामीटर म्यूटेबल वेरिएबल्स नहीं हैं-उनके मान कक्षा के शरीर में नहीं बदला जा सकता है।

भले ही हम val कीवर्ड पर खुद को प्रतिबंधित करते हैं, फिर भी, private val और कीवर्ड-कम पैरामीटर के बीच अभी भी एक अंतर है। निम्नलिखित पर विचार करें:

class Person(private val firstName: String, lastName: String) 

अगर हम javap -v Person साथ संकलित वर्ग को देखो, हम देखेंगे यह केवल एक क्षेत्र है, firstName के लिए। lastName सिर्फ एक निर्माता पैरामीटर, यह कचरा-एकत्र करने के बाद वर्ग आरंभ नहीं हो जाता हो सकता है, जिसका अर्थ है, आदि है

संकलक बहुत चालाक पता करने के लिए जब lastName का मूल्य आरंभीकरण के बाद की आवश्यकता होगी है, और यह एक पैदा करेगा उस मामले में इसके लिए क्षेत्र। निम्नलिखित भिन्नता पर विचार करें:

class Person(private val firstName: String, lastName: String) { 
    def fullName = firstName + " " + lastName 
} 

संकलक बता सकते हैं इसे बाद में lastName का मूल्य की आवश्यकता हो सकती है, और अगर हम javap जाँच फिर हम उस वर्ग दो (ध्यान दें फ़ील्ड होते देखेंगे कि अगर हम परिभाषित था fullName के बजाय val के रूप में, इसमें केवल एक फ़ील्ड होगा)।

class Person(private[this] val firstName: String, lastName: String) 

यह भी var साथ काम करता है:

अन्त में, ध्यान दें कि यदि हम firstNameवस्तु-निजी बजाय वर्ग-निजी के बनाने के लिए, यह वास्तव में एक सादे पुराने कीवर्ड-कम निर्माता पैरामीटर की तरह काम करता val के बजाय:

class Person(private[this] var firstName: String, lastName: String) 

इन कक्षाओं के दोनों कोई फ़ील्ड होगा। ऑब्जेक्ट-प्राइवेट एक्सेस के बारे में अधिक जानकारी के लिए the language specification का सेक्शन 5.2 देखें।

+1

क्या आप कह रहे हैं कि 'def fullName' के साथ उदाहरण जैसी स्थितियों में ** 'निजी val' ** और एक कीवर्ड-कम पैरामीटर के बीच कोई अंतर नहीं है? – RussAbbott

1

पूरक के रूप में, यदि आपकी कक्षा एक केस क्लास है, तो सभी कन्स्ट्रक्टर पैरामीटर स्वचालित रूप से सार्वजनिक फ़ील्ड होंगे।

कंपाइलर निजी कीवर्ड के बारे में शिकायत करेगा यदि यह मौजूद है, और बिना वैल्यू/var के पैरामीटर के लिए, कोई फर्क नहीं पड़ता कि वे किसी भी डीफ़ में उपयोग किए जाते हैं या नहीं, उनके लिए सार्वजनिक क्षेत्र उत्पन्न होंगे।

संबंधित मुद्दे