Frage

Ich brauche eine leere Karte erstellen.

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

Das Problem ist, dass der obige Code diese Warnung erzeugt: Typ Sicherheit: Ungeprüfter Guss von Karte zu HashMap

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

War es hilfreich?

Lösung

1) Wenn die Karte kann unveränderlich sein:

Collections.emptyMap()

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

Sie werden die letztere manchmal verwenden müssen, wenn der Compiler nicht automatisch herausfinden kann, was von Karte Art benötigt wird (das heißt Typinferenz ). Betrachten wir zum Beispiel eine Methode wie folgt erklärt:

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

Wenn Sie die leere Karte direkt an vorbei, müssen Sie über den Typ explizit sein:

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

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

new HashMap<String, String>()

(wie tehblanx wies darauf hin, )


Nachtrag : Wenn Ihr Projekt verwendet Guava , haben Sie folgende Alternativen:

1) Immutable Karte:

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

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

  

Diese Karte verhält sich und führt vergleichbar zu Collections.emptyMap(),   und wird bevorzugt, vor allem für die Konsistenz und Wartbarkeit Ihrer   Code.

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

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

Maps enthält ähnliche Fabrikmethoden für auch andere Arten von Karten instanziiert wird, wie TreeMap oder LinkedHashMap .


Update (2018) : Ein Java 9 oder neue, der kürzeste Code für eine unveränderliche leere Karte zu schaffen ist:

Map.of()

... mit dem neuen Convenience-Factory-Methoden von JEP 269 .

Andere Tipps

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

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

Da Karte eine Schnittstelle ist, müssen Sie einige Klasse auswählen, die es instanziiert, wenn Sie eine leere Instanz erstellen möchten. HashMap scheint so gut wie jeder andere -. So einfach, dass Sie mit

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

Da in vielen Fällen eine leere Karte für null sichere Konstruktion verwendet wird, können Sie die nullToEmpty Dienstprogramm Methode 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()
    }
  }

}  

Ebenso für Sätze:

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

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top