it-swarm.com.de

Warum gibt es WeakHashMap, aber kein WeakSet?

Von J. Bloch

Eine ... Quelle von Speicherverlusten ist Zuhörer ... Der beste Weg dies zu gewährleisten Rückrufe werden aufgefangen ist umgehend nur schwach zu speichern Verweise auf sie beispielsweise durch Speichern Sie sie nur als Schlüssel in einer WeakHashMap .

Warum gibt es kein WeakSet im Java Collections Framework ?

67
Stan Kurilin
Set<Object> weakHashSet = Collections.newSetFromMap(
        new WeakHashMap<Object, Boolean>());

Wie in Collections.newSetFromMap Dokumentation zu sehen ist, übergeben Sie eine WeakHashMap , um eine Set zu erhalten.

179
mart

Warum gibt es kein WeakSet im Java Collection Framework?

Die einzig wirklich richtige Antwort darauf ist, dass wir Ihnen nicht sagen können, warum, weil wir nicht die Personen sind, die die Designentscheidungen getroffen haben. Nur die Java-Designer wissen, warum sie die Entscheidung getroffen haben1.


Während für WeakHashSet möglicherweise begrenzte Anwendungsfälle existieren, bestand ein Teil der Designphilosophie der Java-Klassenbibliothek darin, zu vermeiden, dass die Klassenbibliotheken für alle möglichen Anwendungsfälle mit Dienstprogrammklassen gefüllt werden. 

Es gibt eine Reihe anderer Klassenbibliotheken, die Auflistungstypen enthalten. Apache Commons Collections und Google Collections (auch bekannt als Guava) sind gute Beispiele. Allerdings hat WeakHashSet noch nicht einmal den Schnitt für die Apache- und Google-Bibliotheken "gemacht".

Und natürlich können Sie Collections.newSetFromMap verwenden, um eine WeakHashMap-Instanz einzuhüllen.


1 - Die Debatte über die Richtigkeit dieser Entscheidung ist für StackOverflow nicht möglich. Dies ist eine Q & A-Site, kein Diskussionsforum.

15
Stephen C

Während Sie zwar Collections.newSetFromMap() verwenden können, um ein WeakSet zu erhalten, sind dessen Anwendungsfälle in der Tat ziemlich begrenzt.

Wenn Sie etwas wie String.intern() implementieren möchten, sollten Sie sich stattdessen die Guava-Funktionalität Interners.newWeakInterner() ansehen.

0
Axel Dörfler