Wann würde ich die singletonMap-Methode von Java Collections verwenden?

81

Ich verstehe nicht, warum Sie Java Collections SingletonMap benötigen würden ? Ist es in Multithread-Anwendungen nützlich?

user710818
quelle
3
@skaffman: Das wäre mein schlechtes. Zuerst dachte ich, das OP beziehe sich auf die Commons-Klasse, SingletonMapalso habe ich es bearbeitet. Ich habe seitdem meine Änderungen zurückgesetzt;)
tskuzzy

Antworten:

120

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.

Michael Borgwardt
quelle
12
Ich verwende singletonMap die ganze Zeit in DAOs, die Spring's Named Parameter JDBC Template verwenden. Wenn Sie eine einfache select-Anweisung wie "select foo from bar where id =: barId" haben, benötigen Sie eine Parameterzuordnung mit einem einzelnen Schlüssel-Wert-Paar, barId = 123. Das ist ein großartiger Ort, um singletonMap () zu verwenden.
spaaarky21
1
Wenn eine API eine Karte als Eingabe verwendet und ich Collections.singleton (Schlüssel, Wert) verwende, übergebe ich eine unveränderliche Karte, die für diese API möglicherweise nicht gut ist, da diese API möglicherweise mehr Elemente zu dieser Karte hinzufügt und in In diesem Fall kann nichts getan werden, da es unveränderlich ist.
AKS
2
@AKS: Theoretisch ja, aber in der Praxis ist der Nur-Lese-Zugriff weitaus häufiger, und aus der API-Dokumentation sollte ersichtlich sein, ob Einträge zu einer als Parameter übergebenen Map hinzugefügt werden.
Michael Borgwardt
@PlabonDutta: Nein. Was Sie hätten wissen können, wenn Sie es versucht hätten, indem Sie sich die API-Dokumente angesehen oder einfach darüber nachgedacht hätten, was "Singleton" bedeutet.
Michael Borgwardt
15

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.

hmakholm hat Monica verlassen
quelle
8

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.

Gary
quelle
4

Es dient hauptsächlich der Bequemlichkeit und Abstraktion. Einige APIs nehmen ein Collectionals Argument und es ist schön, eine einfache Möglichkeit zu haben, Objekte in ein Setoder 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.

tskuzzy
quelle
2
Es gibt keine singletonSet () -Methode, sie heißt nur singleton ()
Michael Borgwardt
2

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 singletonMapwird werfenUnsupportedOperationException

Basheer AL-MOMANI
quelle
0

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 EnumSetoder EnumMapist in diesen Fällen oft angebracht, aber diese sind im Vergleich zum obigen Code immer noch ärgerlich ausführlich.

Djechlin
quelle