2017-09-25 44 views
13

वहाँ Map.of() और Collections.emptyMap() के बीच एक अंतर, List.of() और Collections.emptyList() और Set.of() और Collections.emptySet() के बीच के बीच है?Map.of() बनाम Collections.emptyMap()

+1

अंतर किस तरह आप के लिए देख रहे हैं? विधि नाम भिन्न हैं, लेकिन परिणामस्वरूप डेटा संरचनाएं बहुत समान व्यवहार करती हैं। –

+0

@ सी-ओटो यदि आप दावा करते हैं कि विधियां केवल 'बेहद समान' हैं (और समान नहीं हैं), तो आपको स्पष्ट रूप से सोचना चाहिए कि इसमें कोई अंतर है। – jarnbjo

+0

@jarnbjo मतभेद हैं - मेरा उत्तर देखें – xenteros

उत्तर

17

हाँ, वहाँ भी व्यवहार और नहीं संग्रह Collections कक्षा में emptyXyz कारखाने तरीकों से लौट आए और नई of कारखाने तरीकों JDK 9 के साथ इंटरफेस (Map, List, Set) में शुरू के बीच सिर्फ तकनीकी मतभेद , अगर इन्हें कोई तर्क नहीं दिया जाता है।

प्रासंगिक अंतर यह है कि संग्रह नई of कारखाने तरीकों से लौटे null कुंजी और मूल्यों की अनुमति नहीं देने (के रूप में List, Set और Map इंटरफेस में API दस्तावेज़ों में बताया) है। यह खाली संग्रह के लिए असहज लग सकता है, लेकिन अगर यह स्पष्ट रूप से दस्तावेज नहीं है, तो नए संग्रह कार्यान्वयन में एक्सेसर विधियां भी शून्य मानों की जांच करती हैं।

मतभेद के कुछ उदाहरण:

Collections.emptyList().contains(null), अवास्तविक लौटाते हैं, जबकि List.of().contains(null) एक NullPointerException फेंक देते हैं।

Collection.emptyMap().getOrDefault(null, V)V लौटाएगा, जबकि Map.of().getOrDefault(null, V)NullPointerException फेंक देगा।

के रूप में वर्तमान में Oracle की JDK 9 में लागू, कम से कम नए कारखाने तरीकों से लौटे (NullPointerException रों फेंक देंगे, लेकिन 'sanely' व्यवहार करते हैं कि कैसे संग्रह कक्षाएं मूल रूप से डिजाइन किए गए थे के रूप में और संग्रह पर निम्न विधियों में समर्थन करने के लिए निर्दिष्ट अशक्त कुंजी और मूल्यों) Collections कक्षा में वर्ष कारखाने तरीकों का उपयोग कर:

  • List.of().contains(null);
  • Set.of().contains(null);
  • Map.of().containsKey(null);
  • Map.of().containsValue(null);
  • Map.of().getOrDefault(null, <any>);
+0

+1 यह अच्छा है। हो सकता है, जब आप "एपीआई दस्तावेज में बताए गए अनुसार" पर ध्यान आकर्षित करते हैं, तो सभी संग्रह प्रकारों में सेक्शन निर्दिष्ट करें: * "अपरिवर्तनीय स्टेटिक फैक्ट्री विधियां" * जहां इन उदाहरणों के गुणों को समझाया गया है। – slim

+0

इसके अलावा "सैनीली" बहस योग्य है - एनपीई तर्कसंगत रूप से अधिक सचेत है, लेकिन पीछे-संगत नहीं है। – slim

+5

@ स्लिम यहां पिछड़े संगतता के साथ कोई समस्या नहीं है। 'X.of()' विधियां नई हैं, और 'Collections.emptyX()' विधियों की प्रत्यक्ष प्रतिस्थापन के रूप में नहीं हैं। मौजूदा कोड पुराने जावा संस्करणों में काम करना जारी रखेगा। – Jesper

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