2010-10-31 2 views
63

Da J. BlochPerché esiste WeakHashMap, ma WeakSet assente?

A ... fonte di perdite di memoria è ascoltatori ... Il modo migliore per garantire che callback sono garbage collection prontamente è di memorizzare solo deboli riferimenti ad essi, per esempio , da memorizzandoli solo come chiavi in ​​un WeakHashMap.

Quindi, perché non c'è alcun WeakSet in Java Collections framework?

+1

Stas, puoi accettare la risposta in svantaggio del mart, la risposta corretta al posto del downvoted di Martin, risposta errata? – toolforger

risposta

-55

E 'semplice: ci sono casi di utilizzo per WeakHashMap (in particolare, il caso in cui si desidera annotare oggetti con proprietà aggiuntive), ma non ci sono casi di utilizzo per WeakSets.

+6

@Martin v. Löwis: l'implementazione di Observer è un caso d'uso per WeakSets, non è vero? –

+0

Questo è discutibile e una decisione di progettazione dell'API. java.util.Observable ha scelto di mantenere un forte riferimento agli osservatori. È quindi la scelta dell'osservatore passare un (involucro) a un riferimento debole, consentendo all'osservabile di mantenere l'unico riferimento all'osservatore - il che non sarebbe possibile se fossero deferiti per default. –

+0

@ Martin v. Löwis: Hm .. Capisco. È discutibile. Ma ci sono alcune implementazioni in cui il modello di osservatore utilizza i Weakset. E J Bloch lo sa. se è così, perché non esiste una classe speciale per questo? Ma vedo ... Probabilmente questi usi non sono spesso o smt come questo. –

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

da javadoc in java.util.Collections#newSetFromMap(Map)

+4

in realtà qualsiasi Set nella raccolta java contiene Mappa per la memorizzazione. – mart

+2

Sì, ma perché non esiste una classe specifica per queste cose? –

+9

È facile immaginare perché i manutentori di java.util avrebbero voluto smettere di dover fornire due versioni Map e Set di tutto ciò che fanno, e invece hanno scelto di fornire newSetFromMap() invece ... non è vero? –

14

Quindi, perché non c'è alcun WeakSet nel framework di raccolta java?

Mentre ci possono essere limitati casi d'uso per WeakHashSet, parte della filosofia di design libreria di classi Java è stato quello di evitare di popolare le librerie di classi con classi di utilità per tutti i possibili casi d'uso.

Esistono numerose altre librerie di classi che includono tipi di raccolta; Le raccolte di Apache Commons e Google Collections (aka Guava) sono buoni esempi. Tuttavia, WeakHashSet non ha nemmeno "fatto il taglio" per le librerie Apache e Google.

E, naturalmente, è possibile utilizzare Collections.newSetFromMap per includere un'istanza WeakHashMap.

+0

Grazie. Probabilmente ho bisogno di fare più lavoro di osservazione su altre librerie per capire il framework di raccolta java. –

0

Mentre si può effettivamente usare Collections.newSetFromMap() per ottenere un Weakset, i casi d'uso sono in realtà piuttosto limitati.

Se si desidera implementare qualcosa come String.intern(), si potrebbe volere invece dare un'occhiata alla funzionalità di Guava Interners.newWeakInterner().