जावा में, एकाधिक थ्रेड (और सामान्य रूप से) में ऑब्जेक्ट का उपयोग करते समय, फ़ील्ड को अंतिम बनाने के लिए अच्छा अभ्यास है। उदाहरण के लिए,समसामयिक दृश्यता के लिए स्कैला फाइनल बनाम वैल
public class ShareMe {
private final MyObject obj;
public ShareMe(MyObject obj) {
this.obj = obj;
}
}
इस मामले में, obj की दृश्यता लगातार भर में एक से अधिक थ्रेड के बाद से इसे सुरक्षित रूप से अंतिम कीवर्ड का उपयोग कर निर्माण किया है (मान लेते हैं obj सभी अंतिम क्षेत्रों के साथ-साथ है चलो) हो जाएगा।
स्कैला में, यह वैल संकलन को अंतिम संदर्भ में नहीं दिखाता है, बल्कि वैल स्कैला में अर्थशास्त्र है जो आपको एक चर (Scala final variables in constructor) को पुन: असाइन करने से रोकता है। यदि स्कैला कन्स्ट्रक्टर वैरिएबल को अंतिम के रूप में परिभाषित नहीं किया गया है, तो क्या वे एक ही समस्या से पीड़ित होंगे (जब अभिनेताओं में इन वस्तुओं का उपयोग करते हैं)?
उस स्पष्टीकरण के लिए धन्यवाद। क्या आप उस प्रश्न पर अपना अपडेट देख सकते हैं? मैं बिना किसी संशोधक वाले गैर-केस क्लास के लिए अंतिम रूप में घोषित कन्स्ट्रक्टर वेरिएबल्स (जैसा कि जावा में दिखाया गया है) को भी देख रहा हूं। –
@ संक्षिप्त नाम, मैं आपके प्रश्न का उत्तर खोजने की कोशिश कर रहा हूं, [स्कैला में अपरिवर्तनीयता और थ्रेड-सुरक्षा] (http://stackoverflow.com/questions/32113124/immutability-and-thread-safety-in- स्केला)। जैसा कि आप जानते हैं, जावा में 'अंतिम' कीवर्ड का उपयोग सीटीआर के निर्देशों के स्थानांतरण से बचने के लिए भी किया जाता है, जैसा कि [इस] में बताया गया है (https://www.cs.umd.edu/~pugh/java/memoryModel /jsr-133-faq.html#finalRight) लिंक। इसलिए, यदि मैंने सही जवाब समझा है, तो स्काला कक्षा में 'वैल' फ़ील्ड का उपयोग करके जावा क्लास में' अंतिम 'फ़ील्ड घोषित करने के बराबर है, जिससे जेएमएम ठीक तरह से काम कर रहा है? –