मुझे विभिन्न सदस्य चर के साथ एक वर्ग मिला है। एक कन्स्ट्रक्टर है और गेट-विधियां हैं, लेकिन कोई सेटटर-विधियां नहीं हैं। वास्तव में, यह वस्तु अपरिवर्तनीय होना चाहिए।ArrayList सदस्य चर के साथ अपरिवर्तनीय वस्तु - यह चर क्यों बदला जा सकता है?
public class Example {
private ArrayList<String> list;
}
अब मैं निम्नलिखित देखा: जब मैं एक गेटर-विधि के साथ चर सूची मिलता है, मैं नए मूल्यों और इतने पर जोड़ सकते हैं - मैं ArrayList
बदल सकते हैं। जब मैं इस चर के लिए अगली बार get()
पर कॉल करता हूं, तो ArrayList
बदल दिया जाता है। यह कैसे हो सकता है? मैंने इसे फिर से सेट नहीं किया, मैंने अभी इस पर काम किया! String
के साथ यह व्यवहार संभव नहीं है। तो यहाँ क्या अंतर है?
AFAIK की तरह वास्तविक सरणी सूची 'Collections.unmodifiableList()' दी गई सूची के लिए एक अपरिवर्तनीय आवरण रिटर्न ArrayList के प्रति वापस जाने के लिए है। यदि मैं सही हूं, तो उपरोक्तता की गारंटी नहीं होगी। एक वर्ग एक सूची को तुरंत चालू कर सकता है, उदाहरण को तत्काल बना सकता है, और अभी भी उस सूची को संशोधित कर सकता है जो कि निर्माता को मूल सूची को संशोधित करके संशोधित कर रहा है।हालांकि मतभेदों को हल करने के लिए उत्तर पर्याप्त हो सकता है, यह सख्त "अपरिवर्तनीयता" आवश्यकताओं को पूरा करने में विफल हो सकता है। – Maurice
यह सही है। उत्तर अपडेट किया गया। आप 'संग्रह .unmodifiableList (नया ArrayList <> (listArg))' यह सुनिश्चित करने के लिए कर सकते हैं कि कोई भी अंतर्निहित म्यूटेबल सूची का संदर्भ नहीं रखता है और इस प्रकार उत्परिवर्तन से बचता है। – aioobe