जब तक मैं स्कैला संदर्भ में धारा 4.1 नहीं देख लेता, तब तक मैं यही सोचता था private valऔर private final valएक ही जैसे थे:
एक स्थिर मान परिभाषा प्रपत्र का है
final val x = eजहाँ e एक स्थिर अभिव्यक्ति है (.26.24)। अंतिम संशोधक मौजूद होना चाहिए और किसी प्रकार का एनोटेशन नहीं दिया जा सकता है। निरंतर मान x का संदर्भ स्वयं को निरंतर अभिव्यक्तियों के रूप में माना जाता है; उत्पन्न कोड में वे परिभाषा के दाईं ओर ई द्वारा प्रतिस्थापित किए जाते हैं।
और मैंने एक परीक्षा लिखी है:
class PrivateVal {
private val privateVal = 0
def testPrivateVal = privateVal
private final val privateFinalVal = 1
def testPrivateFinalVal = privateFinalVal
}
javap -c उत्पादन:
Compiled from "PrivateVal.scala"
public class PrivateVal {
public int testPrivateVal();
Code:
0: aload_0
1: invokespecial #19 // Method privateVal:()I
4: ireturn
public int testPrivateFinalVal();
Code:
0: iconst_1
1: ireturn
public PrivateVal();
Code:
0: aload_0
1: invokespecial #24 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_0
6: putfield #14 // Field privateVal:I
9: return
}
बाइट कोड वैसा ही है जैसा कि स्काला संदर्भ ने कहा: private valनहीं है private final val।
स्केलक बस के private valरूप में इलाज क्यों नहीं करता है private final val? क्या कोई अंतर्निहित कारण है?
privateस्कोप संशोधक package privateमें जावा के समान शब्दार्थ है । आपके कहने का मतलब हो सकता है private[this]।
privateइसका मतलब है कि यह केवल इस वर्ग के उदाहरणों के लिए दिखाई देता है, private[this]केवल इस उदाहरण - एक ही वर्ग के उदाहरणों को छोड़कर , privateकिसी को भी (एक ही पैकेज से शामिल) मूल्य का उपयोग करने की अनुमति नहीं देता है।
valपहले से ही अपरिवर्तनीय है, इसलिए हमेंfinalScala में कीवर्ड की आवश्यकता क्यों है ? कंपाइलर सभीvals के समान व्यवहार क्यों नहीं कर सकता हैfinal val?