जब तक मैं स्कैला संदर्भ में धारा 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
पहले से ही अपरिवर्तनीय है, इसलिए हमेंfinal
Scala में कीवर्ड की आवश्यकता क्यों है ? कंपाइलर सभीval
s के समान व्यवहार क्यों नहीं कर सकता हैfinal val
?