जावा में सभी अंतिम कक्षाएं अपरिवर्तनीय हैं। स्ट्रिंग और इंटीजर दोनों अंतिम कक्षाएं हैं और दोनों अपरिवर्तनीय हैं I beleive।क्या सभी अंतिम श्रेणी अपरिवर्तनीय हैं?
उत्तर
नहीं - अंतिम श्रेणी का अर्थ है कि आप इससे प्राप्त नहीं कर सकते हैं। इसमें परिवर्तनशीलता के साथ कुछ लेना देना नहीं है। निम्नलिखित वर्ग अंतिम अभी तक परिवर्तनीय है:
public final class FinalMutable {
int value;
public void setValue(int v) { value=v; }
public int getValue() { return value; }
}
नहीं है, अंतिम इसका मतलब वर्ग नहीं बढ़ाई जा सकती। यह परिवर्तनशीलता के बारे में कुछ भी नहीं कहता है। उदाहरण के लिए:
final class MutInt {
public int modifyMe;
}
अपरिवर्तनीयता के लिए कोई कीवर्ड नहीं है, यह एक डिजाइन पैटर्न की तरह है।
संपादित करें:
इसका मतलब है, कोई कीवर्ड नहीं है, जो कक्षा को अपरिवर्तनीय बनाता है। कक्षा को अपरिवर्तनीय बनाने के लिए, आपको आंतरिक या निजी बनाकर आंतरिक की रक्षा करनी होगी।
दुविधापूर्ण यह है: अंतिम कीवर्ड अलग अलग अर्थ है जब एक वर्ग तो यह है जब एक क्षेत्र/चर पर इस्तेमाल किया गया है पर इस्तेमाल किया है। पूर्व का मतलब है "इस वर्ग को बढ़ाया नहीं जा सकता"। दूसरा मतलब है "यह चर (या संदर्भ) बदला नहीं जा सकता"। hash
, जो परिवर्तनशील है और अभिकलन और संग्रहीत जब hashCode()
पहली बार के लिए कहा जाता है वास्तव में है:
फ़ील्ड और चर के लिए "अंतिम" कीवर्ड है - लेकिन फिर, यह वस्तु को अपरिवर्तनीय, केवल संदर्भ नहीं बनाता है। – Rytmis
@Rytmis: हाँ, ठीक है लेकिन कोई keyowrd नहीं है जो एक वर्ग अपरिवर्तनीय बनाता है, जैसे java.lang.String है। मैं यह स्पष्ट करने के लिए उत्तर संपादित कर दूंगा। –
और यहां तक कि अधिक भ्रमित, फ़ील्ड पर 'अंतिम' का उपयोग जावा मेमोरी मॉडल (1.5 से) में विशिष्ट अर्थशास्त्र के साथ अधिभारित किया गया है। – Grundlefleck
अन्य प्रतिक्रियाओं के लिए इसके अलावा, अगर आप java.lang.String
के लिए कोड को देखो आप इसे एक फ़ील्ड में दिखाई देगी।
हालांकि, कक्षा अभी भी अपरिवर्तनीय: hash
फ़ील्ड को कक्षा के बाहर सीधे या संशोधित नहीं किया जा सकता है।
इसके अलावा, आप एक आम दृष्टिकोण देख सकते हैं भीतर JDK यह संशोधित करने की अनुमति के बिना अपरिवर्तनीय रैपर है कि एक वस्तु की आंतरिक स्थिति को बेनकाब करने के लिए इस्तेमाल किया जा सकता के कार्यान्वयन है, जैसे
private final List<String> values;
public List<? get String> getValues() {
return Collections.unmodifiableList(values);
}
और महत्वपूर्ण रूप से थ्रेड सुरक्षा के लिए, हैश फ़ील्ड का आलसी असाइनमेंट एक * सौम्य * डेटा रेस है। यदि यह नहीं था, तो अलग-अलग धागे में हैशकोड() के दो कॉलर दो अलग-अलग मान देख सकते थे। – Grundlefleck
रूप final
से पहले दूसरों के द्वारा कहा गया है जावा में एक वर्ग imuutable नहीं है, हालांकि यह अचल स्थिति रणनीति में एक भूमिका निभाता है। अचल स्थिति प्राप्त करने के लिए कि आप सामान्य दिशा-निर्देश का पालन करना चाहिए:
- सुनिश्चित वर्ग अधिरोहित नहीं किया जा सकता है - वर्ग
final
बनाने के लिए, या स्थिर कारखानों का उपयोग करें और - क्षेत्रों
private
औरfinal
- बल कॉल करने के लिए कर निजी कंस्ट्रक्टर्स रखने एक ही चरण में पूरी तरह से एक वस्तु का निर्माण, बजाय नो तर्क
setXXX
तरीकों (जो है, जावा बीन्स सम्मेलन बचने के लिए) - किसी भी तरीके है जिसके ओर्ब के राज्य को बदल सकते हैं प्रदान नहीं करते हैं करने के लिए आगामी कॉल के साथ संयुक्त निर्माता का उपयोग करने का किसी भी तरह से टी - न केवल
setXXX
तरीकों, लेकिन किसी भी विधि है जो राज्य को बदल सकते हैं - अगर वर्ग किसी भी परिवर्तनशील वस्तु फ़ील्ड होते हैं, तो वे रक्षा प्रतिलिपि बनाई जानी चाहिए जब वर्ग और उसके फोन करने वाले
+ एक सुरक्षा प्रबंधक जोड़ें प्रतिबिंब का उपयोग कर सुलभ ध्वज बदलने अक्षम अक्षम करें! –
एक और बात: रचनाकारों में किसी भी परिवर्तनीय तर्क की रक्षात्मक प्रतियां बनाना सुनिश्चित करें। यह प्रभावी जावा, द्वितीय एड में शामिल है, आइटम # 15 –
आह हाँ मैंने इसे अभी आइटम # 15-> 5 देखा है, लेकिन वास्तविक बिंदु को # readObject' विधियों के लिए कन्स्ट्रक्टर और आइटम # 76 के लिए आइटम # 39 में बनाया गया है –
के बीच पारित कर दिया निजी क्षेत्र उप वर्ग के ओवरराइड तरीकों से पहुँचा नहीं जा सकता ... तो वहाँ कोई रास्ता नहीं उप वर्ग तरीकों सुपर वर्ग की निजी क्षेत्र बदल गया है ... तो क्या अंतिम रूप अपरिवर्तनीय वर्ग बनाने का उपयोग है?
अंतिम कीवर्ड अन्य वर्गों को इसका उत्तराधिकारी रोकता है। अंतिम कीवर्ड इसे अपरिवर्तनीय नहीं बनाता है, लेकिन इस तरह की स्थिति है कि इंस्टेंस क्लास के सदस्यों को निजी रूप से अंतिम और गेटर्स का उपयोग करके और सेटर्स का उपयोग न करें
तो कक्षा को अपरिवर्तनीय बनाने के लिए मुझे सेटर को स्क्रैप करना होगा() कक्षा से बाहर की विधि और इसके आवृत्ति परिवर्तनीय भी बनाते हैं (जो इस मामले में "मान" है) अंतिम। क्या मैं सही हूँ .. ?? – Gourav
हां, आपको सेटर को स्क्रैप करना चाहिए और "मान" अंतिम बनाना चाहिए। –
उसमें जोड़ने के लिए, Rytmis नीचे एक अच्छा बिंदु बनाते हैं। यदि मान एक परिवर्तनीय वस्तु है तो क्या आपका ऑब्जेक्ट वास्तव में अपरिवर्तनीय है? सबसे अच्छा मूल्य निजी बनाएं और रक्षात्मक प्रतिलिपि करने के लिए प्राप्त करें। –