webentwicklung-frage-antwort-db.com.de

Der beste Weg, um eine leere Map in Java

Ich muss eine leere Karte erstellen.

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

Das Problem ist, dass der obige Code diese Warnung erzeugt: Typensicherheit: Nicht angehaktes Cast von Map nach HashMap

Was ist der beste Weg, um diese leere Karte zu erstellen?

101
JorgeO

1) Wenn die Karte unveränderlich sein kann:

Collections.emptyMap()

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

Sie müssen letzteres manchmal verwenden, wenn der Compiler nicht automatisch herausfinden kann, welche Art von Map benötigt wird (dies wird Typinferenz ). Betrachten Sie zum Beispiel eine wie folgt deklarierte Methode:

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

Wenn Sie die leere Map direkt an sie übergeben, müssen Sie den Typ explizit angeben:

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

2) Wenn Sie in der Lage sein müssen, die Karte zu ändern, dann zum Beispiel:

new HashMap<String, String>()

(als Tehblanx wies darauf hin )


Nachtrag : Wenn in Ihrem Projekt Guave verwendet wird haben Sie folgende Alternativen:

1) Unveränderliche Karte:

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

Zugegeben, hier gibt es keine großen Vorteile im Vergleich zu Collections.emptyMap(). Aus dem Javadoc :

Diese Zuordnung verhält sich und verhält sich vergleichbar mit Collections.emptyMap() und wird hauptsächlich aus Gründen der Konsistenz und Wartbarkeit des Codes bevorzugt.

2) Map, die Sie ändern können:

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

Maps enthält ähnliche Factory-Methoden zum Instanziieren anderer Kartentypen, z. B. TreeMap oder LinkedHashMap ] _ .


Update (2018) : Bei Java 9 oder neuer der kürzeste Code Für die Erstellung einer unveränderlichen leeren Karte gilt Folgendes:

Map.of()

... mit den neuen Convenience-Factory-Methoden von JEP 269 . ????

207
Jonik
14
TofuBeer
14
basszero

Wenn Sie eine Instanz von HashMap benötigen, ist der beste Weg:

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

Da Map eine Schnittstelle ist, müssen Sie eine Klasse auswählen, die sie instanziiert, wenn Sie eine leere Instanz erstellen möchten. HashMap scheint so gut wie jedes andere zu sein - also benutze es einfach.

9
AndreiM

Entweder Collections.emptyMap(), oder wenn die Typinferenz in Ihrem Fall nicht funktioniert,
Collections.<String, String>emptyMap()

7

Da in vielen Fällen eine leere Map für den nullsicheren Entwurf verwendet wird, können Sie die Dienstprogrammmethode nullToEmpty verwenden:

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()
    }
  }

}  

Ähnliches gilt für Sets:

class SetUtils {

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

}

und Listen:

class ListUtils {

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

}
2
1
OscarRyz