मैं जावा कलेक्शंस सिंगलटन मैप विधि का उपयोग कब करूंगा?


81

मुझे समझ नहीं आ रहा है कि आपको जावा कलेक्शंस सिंगलटन मैप की आवश्यकता क्यों होगी ? क्या यह बहुपरत अनुप्रयोगों में उपयोगी है?


3
@skaffman: यह मेरा बुरा होगा। पहले मुझे लगा कि ओपी कॉमन्स वर्ग का जिक्र कर SingletonMapरहा है इसलिए मैंने इसे संपादित किया। जब से मैंने अपने परिवर्तन वापस किए हैं;)
tskuzzy

जवाबों:


123

असल में, यह आपको ऐसा करने की अनुमति देता है:

callAPIThatTakesAMap(Collections.singletonMap(key, value));

इसके बजाय:

Map<KeyType, ValueType> m = new HashMap<KeyType, ValueType>();
m.put(key, value);
callAPIThatTakesAMap(m);

जो बहुत अच्छा है जब आपके पास केवल एक ही कुंजी / मूल्य जोड़ी होती है। इस स्थिति में शायद बहुत बार उठता नहीं है, लेकिन singleton()और singletonList()अक्सर उपयोगी हो सकता है।


12
मैं डीएओ के हर समय सिंगलटन मैप का उपयोग करता हूं जो स्प्रिंग के नामांकित पैरामीटर JDBC टेम्पलेट का उपयोग करता है। यदि आपके पास एक सरल चयन कथन है जैसे "select foo from bar where id =: barId" तो आपको सिंगल की-वैल्यू पेयर, बारिड = 123 के साथ एक पैरामीटर मैप की आवश्यकता होगी। यह सिंगलटनप्लस () का उपयोग करने के लिए एक शानदार जगह है।
स्पाकार्की 21

1
यदि कोई API इनपुट के रूप में मानचित्र लेता है और मैं Collections.singleton (कुंजी, मान) का उपयोग कर रहा हूं, तो मैं अपरिवर्तनीय मानचित्र पास कर रहा हूं, जो उस एपीआई के लिए अच्छा नहीं हो सकता है, क्योंकि हो सकता है कि एपीआई इस नक्शे में और तत्वों को जोड़ता है, और में इस मामले में, कुछ भी नहीं किया जा सकता क्योंकि यह अपरिवर्तनीय है।
एकेएस

2
@AK: सिद्धांत रूप में हाँ, लेकिन व्यवहारिक रूप से पढ़े जाने के लिए केवल पहुँच कहीं अधिक सामान्य है, और यह एपीआई प्रलेखन से स्पष्ट होना चाहिए कि क्या प्रविष्टियों को पैरामीटर के रूप में पारित मानचित्र में जोड़ा जाता है।
माइकल बोर्गवर्ड

@PlabonDutta: नहीं, जिसे आप इसे जानने की कोशिश कर सकते हैं, एपीआई डॉक्स को देखकर, या केवल "सिंगलटन" के बारे में सोचकर।
माइकल बोर्गवर्ड

15

यह उपयोगी है यदि आपको कुछ सामान्य कोड (एक पैरामीटर के रूप में, या एक विधि के परिणामस्वरूप) के लिए एक नक्शा पास करने की आवश्यकता है और आप जानते हैं कि इस विशेष मामले में - लेकिन शायद अन्य मामलों में जो नक्शे को उसी सामान्य में पास नहीं करते हैं कोड - आप जिस नक्शे को पास करना चाहते हैं, उसमें केवल एक ही कुंजी है। उस मामले में, सिंगलटन पूर्ण विकसित मानचित्र कार्यान्वयन की तुलना में अधिक कुशल है, और प्रोग्रामर के लिए भी अधिक सुविधाजनक है क्योंकि आपको जो कुछ भी कहने की ज़रूरत है वह कंस्ट्रक्टर में कहा जा सकता है।


8

इसके अलावा, एक SingletonMap कार्यान्वयन द्वारा लौटाया गया है, जो एक संग्रह है। इसमें केवल दो सदस्य फ़ील्ड शामिल हैं: कुंजी और मान, जबकि एक HashMap नोड ऑब्जेक्ट्स या अन्य सदस्य फ़ील्ड के आंतरिक सरणी को बनाए रखता है। इसलिए यदि आप स्मृति में इन मानचित्रों का एक बहुत कुछ बना रहे हैं , तो कलेक्शंस.सिंघलटन () का उपयोग करना एक विवेकपूर्ण विकल्प होगा।


4

यह मुख्य रूप से सुविधा और अमूर्तता के लिए है। कुछ एपीआई एक ले Collectionएक तर्क के रूप और यह अच्छा एक को परिवर्तित वस्तुओं के लिए एक आसान तरीका है करने के लिए Setया Map

singletonMap()और singletonList()वास्तव singletonSet()में जावा 1.3 के बाद पेश किए गए क्योंकि singletonSet()उपयोगी साबित हुए।


2
कोई सिंगलटनसेट () विधि नहीं है, इसे सिर्फ सिंगलटन कहा जाता है ()
माइकल बोर्गवर्ड

2

कई जवाबों ने आपको बताया कि कब, लेकिन मैं इंगित करना चाहता हूं कि कब not use it

यदि आप चाहते हैं put items later on, तो इसका उपयोग न करें

क्योंकि कार्यान्वयन के singletonMapफेंक दिया जाएगाUnsupportedOperationException


0

यह सिर्फ एक और उदाहरण है, लेकिन मैंने यह पंक्ति कोड लिखी है:

@Override public Map<Action, Promise<Boolean>> actOnResults() throws Exception {
    return Collections.singletonMap(Action.UPDATE_DATABASE, saver.save(results));
}

ध्यान दें @Override। इंटरफ़ेस आमतौर पर कई चीजों के नक्शे ले सकता है; यह विशेष रूप से तात्कालिकता हमेशा एक नक्शा देता है जिसमें एक चीज होती है। यह भी ध्यान दें कि नक्शे की कुंजी एक Enum है। इसलिए नक्शे को कभी भी बड़ा नहीं माना जाता है, वे केवल उन कार्यों के परिणामों को निर्दिष्ट करने वाले होते हैं जिन्हें निर्दिष्ट किया जाता है। मेरे वास्तविक उदाहरण में 5 कार्य हैं, और यह तात्कालिकता केवल उनमें से एक का उपयोग करती है।

पूर्ण होने के लिए, EnumSetया EnumMapइन मामलों में अक्सर उचित होता है, लेकिन ऊपर दिए गए कोड की तुलना में वे अभी भी नाराज हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.