ऐसे कई मामले हैं जहां आप अपरिवर्तनीय नक्शे, सूची, सेट या अन्य प्रकार के संग्रह का उपयोग करना पसंद करेंगे।
पहला और यकीनन सबसे महत्वपूर्ण उपयोग मामला है जब भी आप किसी क्वेरी या एक संगणना के परिणाम को वापस करते हैं जो परिणामों का एक सेट (या सूची या मानचित्र) लौटाएगा, तो आपको अपरिवर्तनीय डेटा संरचनाओं का उपयोग करना पसंद करना चाहिए।
इस मामले में, मैं इनमें से अपरिवर्तनीय संस्करणों को वापस करना पसंद करता हूं क्योंकि यह एक संगणना के परिणाम के तथ्यात्मक अचलता को बहुत अधिक स्पष्ट रूप से दर्शाता है - कोई फर्क नहीं पड़ता कि आप बाद में डेटा के साथ क्या करते हैं, आपके क्वेरी से प्राप्त परिणामों का सेट नहीं होना चाहिए। परिवर्तन।
दूसरा सामान्य उपयोग का मामला है जब आपको किसी विधि या सेवा के इनपुट के रूप में तर्क प्रदान करने की आवश्यकता होती है। जब तक आप इनपुट संग्रह को सेवा या विधि (जो आमतौर पर वास्तव में खराब डिजाइन का विचार है) द्वारा संशोधित किए जाने की उम्मीद करते हैं, तब तक परिवर्तनशील के बजाय अपरिवर्तनीय संग्रह में गुजरना कई मामलों में उचित और सुरक्षित विकल्प हो सकता है।
मैं इसे "वैल्यू बाय पास" सम्मेलन के रूप में सोचता हूं ।
आम तौर पर - जब भी डेटा मॉड्यूल या सेवा सीमाओं को पार करता है, तो एक अपरिवर्तनीय डेटा संरचनाओं का उपयोग करने के लिए यह एक समझदार अभ्यास है। इससे (अपरिवर्तनीय) इनपुट / आउटपुट और परस्पर आंतरिक स्थिति के बीच अंतर के बारे में तर्क करना बहुत आसान हो जाता है।
इस के एक बहुत ही लाभदायक साइड इफेक्ट के रूप में आपके मॉड्यूल / सेवाओं की सुरक्षा और थ्रेड सुरक्षा में वृद्धि हुई है और यह चिंताओं को साफ करने के लिए अलग है।
Collections.empty*()तरीकों का उपयोग करने का एक और अच्छा कारण उनकी क्रियात्मकता की ध्यान देने योग्य कमी है। पूर्व-जावा 7 युग में, यदि आपके पास एक सामान्य संग्रह था, तो आपको पूरे स्थान पर सामान्य प्रकार के एनोटेशन छिड़कने होंगे।
बस इन दो घोषणाओं की तुलना करें:
Map<Foo, Comparable<? extends Bar>> fooBarMap = new HashMap<Foo, Comparable<? extends Bar>>();
बनाम:
Map<Foo, Comparable<? extends Bar>> fooBarMap = Collections.emptyMap();
उत्तरार्द्ध स्पष्ट रूप से दो महत्वपूर्ण तरीकों से पठनीयता पर जीत हासिल करता है:
- पहले घोषणापत्र में, एक खाली नक्शे की पूरी तात्कालिकता को सामान्य प्रकार की घोषणाओं के शोर में दफन किया जाता है, जो अनिवार्य रूप से तुच्छ घोषणा को बहुत अधिक गूढ़ बनाता है।
- दाईं ओर जेनेरिक प्रकार के एनोटेशन की उल्लेखनीय कमी के अलावा, दूसरा संस्करण स्पष्ट रूप से बताता है कि नक्शे को एक खाली नक्शे के लिए आरंभीकृत किया गया है। इसके अलावा - यह जानते हुए कि यह विधि एक अपरिवर्तनीय मानचित्र लौटाती है, अब मेरे लिए यह खोजना आसान है कि कहां
fooBarMapपर एक और गैर-रिक्त मान असाइन किया जा रहा है /fooBarMap =/।