जावा में एक खाली नक्शा बनाने का सबसे अच्छा तरीका


117

मुझे खाली नक्शा बनाने की जरूरत है।

if (fileParameters == null)
    fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;

समस्या यह है कि उपरोक्त कोड इस चेतावनी को उत्पन्न करता है: प्रकार की सुरक्षा: मैप से हाशप तक अनियंत्रित डाली

इस खाली मानचित्र को बनाने का सबसे अच्छा तरीका क्या है?


फ़ाइलपैरेटर्स के लिए आपका घोषित प्रकार क्या है?
jjnguy

आपको शायद ClassCastException भी मिल जाएगी।
टॉम हॉकिन -

1
fileParameters एक Map होना चाहिए न कि कोई HashMap।
स्टीव कुओ

जवाबों:


241

1) अगर नक्शा अपरिवर्तनीय हो सकता है:

Collections.emptyMap()

// or, in some cases:
Collections.<String, String>emptyMap()

आपको कभी-कभी बाद का उपयोग करना होगा जब कंपाइलर स्वचालित रूप से यह पता नहीं लगा सकता है कि किस तरह के मानचित्र की आवश्यकता है (इसे प्रकार का निष्कर्ष कहा जाता है )। उदाहरण के लिए, इस तरह घोषित एक विधि पर विचार करें:

public void foobar(Map<String, String> map){ ... }

खाली मैप को सीधे पास करते समय, आपको टाइप के बारे में स्पष्ट होना होगा:

foobar(Collections.emptyMap());                 // doesn't compile
foobar(Collections.<String, String>emptyMap()); // works fine

2) यदि आपको मानचित्र को संशोधित करने में सक्षम होना है, तो उदाहरण के लिए:

new HashMap<String, String>()

(जैसा कि तहबलन ने बताया )


परिशिष्ट : यदि आपकी परियोजना अमरूद का उपयोग करती है , तो आपके पास निम्नलिखित विकल्प हैं:

1) अपरिवर्तनीय नक्शा:

ImmutableMap.of()
// or:
ImmutableMap.<String, String>of()

दी गई तुलना में यहाँ कोई बड़ा लाभ नहीं है Collections.emptyMap()जावदोक से :

यह मानचित्र व्यवहार करता है और तुलनात्मक रूप से करता है Collections.emptyMap(), और आपके कोड की स्थिरता और स्थिरता के लिए मुख्य रूप से बेहतर है।

2) नक्शा जिसे आप संशोधित कर सकते हैं:

Maps.newHashMap()
// or:
Maps.<String, String>newHashMap()

Mapsअन्य प्रकार के नक्शों को तात्कालिक बनाने के लिए समान फैक्ट्री विधियाँ शामिल हैं, जैसे कि TreeMapया LinkedHashMap


अपडेट (2018) : जावा 9 या नए पर, एक अपरिवर्तनीय खाली नक्शा बनाने के लिए सबसे छोटा कोड है:

Map.of()

... JEP 269 से नई सुविधा कारखाना विधियों का उपयोग करना । 😎


ज्यादातर मामलों में,
टाइपिंग का

हाँ सच है। मैंने उत्तर को थोड़ा और व्यापक होने के लिए संपादित किया।
जोनीक

16

समस्या यह थी कि यह नक्शा केवल एक मैप ऑब्जेक्ट पर लागू किया जा सकता है न कि
हाशप

7
आपको (आम तौर पर) अपने विशिष्ट प्रकार की वस्तुओं को घोषित करने से बचना चाहिए और इसके बजाय इंटरफ़ेस (या अमूर्त अभिभावक) का उपयोग करना चाहिए। "HashMap <स्ट्रिंग, स्ट्रिंग> फू;" से बचने की कोशिश करें और "मानचित्र <स्ट्रिंग, स्ट्रिंग> फू;" का उपयोग करें इसके बजाय
टोफूबीर


10

यदि आपको HashMap का उदाहरण चाहिए, तो सबसे अच्छा तरीका है:

fileParameters = new HashMap<String,String>();

चूंकि मानचित्र एक इंटरफ़ेस है, इसलिए आपको कुछ वर्ग चुनने की ज़रूरत है जो इसे खाली करना चाहते हैं यदि आप एक खाली उदाहरण बनाना चाहते हैं। HashMap किसी भी अन्य के रूप में अच्छा लगता है - तो बस उस का उपयोग करें।


7

या तो Collections.emptyMap(), या यदि प्रकार का अनुमान आपके मामले में काम नहीं करता है,
Collections.<String, String>emptyMap()


2

चूंकि कई मामलों में शून्य-सुरक्षित डिज़ाइन के लिए एक खाली मानचित्र का उपयोग किया जाता है, आप nullToEmptyउपयोगिता पद्धति का उपयोग कर सकते हैं :

class MapUtils {

  static <K,V> Map<K,V> nullToEmpty(Map<K,V> map) {
    if (map != null) {
      return map;
    } else {
       return Collections.<K,V>emptyMap(); // or guava ImmutableMap.of()
    }
  }

}  

इसी तरह सेट के लिए:

class SetUtils {

  static <T> Set<T> nullToEmpty(Set<T> set) {
    if (set != null) {
      return set;
    } else {
      return Collections.<T>emptySet();
    }
  }

}

और सूची:

class ListUtils {

  static <T> List<T> nullToEmpty(List<T> list) {
    if (list != null) {
      return list;
    } else {
      return Collections.<T>emptyList();
    }
  }

}

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