Ich verstehe nicht, warum Sie Java Collections SingletonMap benötigen würden ? Ist es in Multithread-Anwendungen nützlich?
Ich verstehe nicht, warum Sie Java Collections SingletonMap benötigen würden ? Ist es in Multithread-Anwendungen nützlich?
Antworten:
Grundsätzlich können Sie dies tun:
callAPIThatTakesAMap(Collections.singletonMap(key, value));
lieber als das:
Map<KeyType, ValueType> m = new HashMap<KeyType, ValueType>();
m.put(key, value);
callAPIThatTakesAMap(m);
Das ist viel schöner, wenn Sie nur ein einziges Schlüssel / Wert-Paar haben. Diese Situation entsteht wahrscheinlich nicht sehr oft, aber singleton()
und singletonList()
recht häufig nützlich sein kann.
Es ist nützlich, wenn Sie eine Karte an einen allgemeinen Code übergeben müssen (als Parameter oder als Ergebnis einer Methode) und dies in diesem speziellen Fall wissen - aber möglicherweise nicht in anderen Fällen, in denen die Karte an denselben allgemeinen Code übergeben wird Code - Die Karte, die Sie übergeben möchten, hat nur einen einzigen Schlüssel. In diesem Fall ist die SingletonMap effizienter als eine vollständige Kartenimplementierung und auch für den Programmierer bequemer, da alles, was Sie zu sagen haben, im Konstruktor gesagt werden kann.
Außerdem hat eine von Collections.singletonMap () zurückgegebene SingletonMap-Implementierung einen geringeren Speicherbedarf als eine reguläre HashMap. Es muss nur zwei Mitgliedsfelder enthalten: den Schlüssel und den Wert, während eine HashMap ein internes Array von Knotenobjekten sowie andere Mitgliedsfelder verwaltet. Wenn Sie also viele dieser Karten im Speicher erstellen, ist es ratsam, Collections.singletonMap () zu verwenden.
Es dient hauptsächlich der Bequemlichkeit und Abstraktion. Einige APIs nehmen ein Collection
als Argument und es ist schön, eine einfache Möglichkeit zu haben, Objekte in ein Set
oder zu konvertieren Map
.
singletonMap()
und singletonList()
wurden tatsächlich nach singletonSet()
in Java 1.3 eingeführt, weil es singletonSet()
sich als nützlich erwiesen hat.
Viele Antworten sagten Ihnen wann, aber ich möchte darauf hinweisen, wann not use it
benutze es nicht, wenn du willst put items later on
,
weil setzen Implementierung von singletonMap
wird werfenUnsupportedOperationException
Dies ist nur ein weiteres Beispiel, aber ich habe diese Codezeile geschrieben:
@Override public Map<Action, Promise<Boolean>> actOnResults() throws Exception {
return Collections.singletonMap(Action.UPDATE_DATABASE, saver.save(results));
}
Beachten Sie die @Override
. Die Schnittstelle kann allgemein Karten von vielen Dingen aufnehmen; Diese spezielle Instanziierung gibt nur immer eine Karte zurück, die eine Sache enthält. Beachten Sie auch, dass der Schlüssel zur Karte eine Aufzählung ist. Die Karten sollten also niemals groß sein, sondern nur die Ergebnisse der angegebenen Aktionen enthalten. In meinem realen Beispiel gibt es bis zu 5 Aktionen, und diese Instanziierung verwendet nur eine davon.
Vollständig zu sein EnumSet
oder EnumMap
ist in diesen Fällen oft angebracht, aber diese sind im Vergleich zum obigen Code immer noch ärgerlich ausführlich.
SingletonMap
also habe ich es bearbeitet. Ich habe seitdem meine Änderungen zurückgesetzt;)