2011-08-19 10 views
50

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

+2

@ स्काफमैन: यह मेरा बुरा होगा। सबसे पहले मैंने सोचा कि ओपी कॉमन्स क्लास 'सिंगलटन मैप' का जिक्र कर रहा था इसलिए मैंने इसे संपादित किया।मैंने तब से अपने परिवर्तनों को वापस ले लिया है;) – tskuzzy

उत्तर

78

असल में, यह आप ऐसा कर सकते हैं:

callAPIThatTakesAMap(Collections.singletonMap(key, value)); 
बल्कि इस से

:

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

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

+7

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

+1

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

+2

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

11

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

+0

अच्छा स्पष्टीकरण –

4

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

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

+2

कोई सिंगलटनसेट() विधि नहीं है, इसे सिंगलटन() –

0

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

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

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

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

4

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

0

कई जवाब तुमसे कहा था जब, लेकिन मैं

क्योंकि singletonMap का पुट कार्यान्वयन UnsupportedOperationException

फेंक होगा जब not use it

के लिए बाहर इंगित करना चाहते हैं यह का उपयोग नहीं करते, तो आप put items later on करना चाहते हैं,

संबंधित मुद्दे