2010-03-17 16 views
13

जावा मेमोरी मॉडल (1.5 से) final फ़ील्ड को अलग-अलग गैर-final फ़ील्ड के साथ व्यवहार करता है। विशेष रूप से, this संदर्भ निर्माण के दौरान नहीं बचता है, कन्स्ट्रक्टर में final फ़ील्ड लिखने के लिए अन्य थ्रेड पर दिखाई देने की गारंटी दी जाती है, भले ही ऑब्जेक्ट डेटा थ्रेड के माध्यम से अन्य थ्रेड पर उपलब्ध कराया गया हो। (गैर-final फ़ील्ड को दृश्यमान होने की गारंटी नहीं है, इसलिए यदि आप उन्हें अनुचित रूप से प्रकाशित करते हैं, तो एक और धागा उन्हें आंशिक रूप से निर्मित राज्य में देख सकता है।)स्कैला और जावा मेमोरी मॉडल

क्या कोई दस्तावेज है कि स्कैला कंपाइलर कैसे बनाता है final (गैर-final के बजाय) कक्षाओं के लिए बैकिंग फ़ील्ड? मैंने भाषा विनिर्देश को देखा है और वेब की खोज की है लेकिन कोई निश्चित उत्तर नहीं मिल रहा है।

उत्तर

4

मैं पता लगाने के लिए जब परिवर्तन किया गया था इतिहास के माध्यम से खोदा।

JVM में स्काला के प्रक्षेपण भाषा विनिर्देश में शामिल नहीं है।

+7

होता था लेकिन भाषा संरचनाओं के एक समवर्ती परिप्रेक्ष्य से व्यवहार, इसके विनिर्देश का हिस्सा होना चाहिए जो मैं तर्क दूंगा! –

3

यह एक final क्षेत्र पैदा करता है जब आप एक val के रूप में कुछ की घोषणा (इसकी तुलना में @scala.volatile एनोटेशन volatile के रूप में एक क्षेत्र चिह्नित करने के लिए दस्तावेज है)। कुछ भी जिनके संदर्भ संशोधित किए जा सकते हैं, जैसे var, (स्पष्ट रूप से) final नीचे नहीं हो सकते हैं।

इसका मतलब है कि case classes अंतिम क्षेत्रों में भी होते हैं (एक मामले वर्ग निर्माता के तर्कों के रूप परोक्ष val रों हैं)

+1

मुझे नहीं लगता कि यह मामला होता है (उदाहरण के लिए http://old.nabble.com/Val-and-Final-td13355515.html देखें)। मेरे प्रश्न के कारण का एक हिस्सा - यदि यह किसी दस्तावेज़ के बिना बदल सकता है, तो मुझे कैसे पता चलेगा कि यह फिर से नहीं बदलेगा? –

+1

आप सही हैं कि यह दस्तावेज किया जाना चाहिए था। यह केवल प्रदर्शन का मुद्दा नहीं है बल्कि स्मृति मॉडल के कारण भाषा का हिस्सा है। मुझे पता नहीं था कि vals गैर-फाइनल –

2

मैंने Scala bug सिस्टम में इसके लिए एक दस्तावेज़ बग दायर किया है।

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