Collections.unmodifiableList
का उपयोग करते हुए प्रत्यक्ष पर्याप्त नहीं है।
मैं एक सौंपने सूची कार्यान्वयन है कि मूल परिवर्तनशील सूची (प्रतिनिधि) के लिए एक आंतरिक संदर्भ के लिए होता है और आगे विधि के सभी यह करने के लिए कॉल पैदा करेगा। यह हाथ से ऐसे कोड लिखने के लिए एक पिटा है, लेकिन उदाहरण के लिए ग्रहण स्वचालित रूप से आपके लिए उत्पन्न कर सकता है।
फिर freeze
विधि बुला की बात है, मैं मूल सूची Collections.unmodifiableList
जो यह सुनिश्चित करता है भविष्य विधि के सभी कॉल करने के लिए FreezingList
केवल unmodifable दृश्य के माध्यम से मूल प्रतिनिधि के लिए जाने के साथ रैप होगा।
चीजों को और अधिक सुरक्षित बनाने के लिए, लेकिन कम लचीला बनाने के लिए, आप निम्न कन्स्ट्रक्टर को बदल सकते हैं और मूल सूची को पास करने के बजाय (जो क्लाइंट को मूल म्यूटेबल सूची का संदर्भ छोड़ सकता है) आंतरिक रूप से सूची को तुरंत चालू कर सकता है (उदाहरण के लिए ArrayList
)।
public class FreezingList<E> implements List<E> {
// the original list you delegate to (the delegate)
private List<E> list;
private boolean frozen = false;
public FreezingList(List<E> list) {
this.list = list;
}
public void freeze() {
if (!frozen) {
list = Collections.unmodifiableList(list);
frozen = true;
}
}
// all the delegating methods follow:
public int size() {
return list.size();
}
public E get(int index) {
return list.get(index);
}
// etc. etc.
}
क्या आप इनमें से एक का मतलब है? http://download.oracle.com/javase/6/docs/api/java/util/Collections.html?is-external=true#unmodifiableList(java.util.List)। आप अपनी खुद की सूची (एक रणनीति के रूप में) बना सकते हैं, और जब फ्रीज विधि लागू की जाती है, तो आप एक अपरिवर्तनीय सूची के लिए आंतरिक सूची बदलते हैं। – Augusto