वैल/var के बिना एक निजी var कन्स्ट्रक्टर पैरामीटर और कन्स्ट्रक्टर पैरामीटर के बीच क्या अंतर है? क्या वे दायरे/दृश्यता के मामले में समान हैं?स्कैला कन्स्ट्रक्टर पैरामीटर्स
पूर्व:
class Person(private var firstName:String, lastName:String)
वैल/var के बिना एक निजी var कन्स्ट्रक्टर पैरामीटर और कन्स्ट्रक्टर पैरामीटर के बीच क्या अंतर है? क्या वे दायरे/दृश्यता के मामले में समान हैं?स्कैला कन्स्ट्रक्टर पैरामीटर्स
पूर्व:
class Person(private var firstName:String, lastName:String)
हाँ, वहाँ दो महत्वपूर्ण मतभेद हैं। पहले आसान के लिए: 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 देखें।
क्या आप कह रहे हैं कि 'def fullName' के साथ उदाहरण जैसी स्थितियों में ** 'निजी val' ** और एक कीवर्ड-कम पैरामीटर के बीच कोई अंतर नहीं है? – RussAbbott
पूरक के रूप में, यदि आपकी कक्षा एक केस क्लास है, तो सभी कन्स्ट्रक्टर पैरामीटर स्वचालित रूप से सार्वजनिक फ़ील्ड होंगे।
कंपाइलर निजी कीवर्ड के बारे में शिकायत करेगा यदि यह मौजूद है, और बिना वैल्यू/var के पैरामीटर के लिए, कोई फर्क नहीं पड़ता कि वे किसी भी डीफ़ में उपयोग किए जाते हैं या नहीं, उनके लिए सार्वजनिक क्षेत्र उत्पन्न होंगे।
इस प्रश्न को देखें: http://stackoverflow.com/questions/15639078/scala-class-constructor-parameters – danielkza
इसमें एक बेहतर स्पष्टीकरण है: http://stackoverflow.com/questions/14694712/do-scala- कन्स्ट्रक्टर-पैरामीटर-डिफॉल्ट-टू-प्राइवेट-वैल – lcn