मैं जब तक मैं स्काला संदर्भ में खंड 4.1 देखा था, लगता है कि private val
और private final val
ही कर रहे हैं प्रयोग किया है:`निजी मूल्य 'और` निजी अंतिम मूल्य' क्यों अलग हैं?
एक निरंतर मूल्य परिभाषा फार्म की है
final val x = e
(जहां ई एक निरंतर अभिव्यक्ति है §6.24)। अंतिम संशोधक उपस्थित होना चाहिए और कोई भी प्रकार की टिप्पणी नहीं दी जा सकती है। निरंतर मान x के संदर्भ स्वयं को निरंतर अभिव्यक्ति के रूप में माना जाता है; जेनरेट कोड में उन्हें परिभाषा के दाएं हाथ की तरफ से बदल दिया जाता है।
और मैं एक परीक्षण में लिखा है:
class PrivateVal {
private val privateVal = 0
def testPrivateVal = privateVal
private final val privateFinalVal = 1
def testPrivateFinalVal = privateFinalVal
}
javap -c
उत्पादन: private val
private final val
नहीं है:
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
}
बाइट कोड बस के रूप में स्काला संदर्भ कहा है।
क्यों नहीं scalac सिर्फ private val
private final val
के रूप में इलाज करता है? क्या कोई अंतर्निहित कारण है?
दूसरे शब्दों में: चूंकि 'वैल' पहले से ही अपरिवर्तनीय है, इसलिए हमें स्केल में 'अंतिम' कीवर्ड क्यों चाहिए? कंपाइलर 'वैल' के समान वैल्यू का इलाज क्यों नहीं कर सकता? – Jesper
ध्यान दें कि 'निजी' स्कोप संशोधक के पास जावा में 'पैकेज निजी' के समान अर्थशास्त्र है। आप 'निजी [यह]' कह सकते हैं। –
@ConnorDoyle: पैकेज निजी के रूप में? मुझे ऐसा नहीं लगता: 'निजी' का मतलब है कि यह केवल इस वर्ग के उदाहरणों के लिए दृश्यमान है, 'निजी [यह]' केवल इस उदाहरण - एक ही ** कक्षा ** के उदाहरणों को छोड़कर, 'निजी' अनुमति नहीं देता है मूल्य तक पहुंचने के लिए कोई भी (उसी पैकेज से शामिल)। – Make42