Der beste Weg, eine leere Karte in Java erstellen
-
10-07-2019 - |
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?
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();
}
}
}
Was ist mit: