2010-10-31 15 views
63

De J. Bloch¿Por qué existe WeakHashMap, pero ausente WeakSet?

Un ... fuente de pérdidas de memoria es oyentes ... La mejor manera de asegurar que devoluciones de llamada son basura recogida prontitud es almacenar sólo débiles referencias a ellos, por ejemplo, , por almacenándolos solo como claves en WeakHashMap.

Entonces, ¿por qué no hay ningún WeakSet en Java Collections framework?

+1

Stas, ¿puede usted aceptar la respuesta correcta de mart, la respuesta correcta en lugar de la respuesta incorrecta de Martin? – toolforger

Respuesta

-55

Es muy sencillo: hay casos de uso para WeakHashMap (en particular, el caso en el que desea realizar anotaciones objetos con propiedades adicionales), pero no hay casos de uso para WeakSets.

+6

@Martin v. Löwis: la implementación de Observer es un caso de uso para WeakSets, ¿no es así? –

+0

Eso es discutible, y una decisión de diseño de API. java.util.Observable ha optado por mantener una fuerte referencia a los observadores. Entonces es la elección del observador pasar una (envoltura) a una referencia débil, permitiendo que el observable mantenga la única referencia al observador, lo que no sería posible si se hace referencia débilmente por defecto. –

+0

@Martin v. Löwis: Hm ... Ya veo. Es discutible Pero hay algunas implementaciones en las que el patrón de observador usa WeakSets. Y J Bloch lo sabe. si es así, ¿por qué no hay ninguna clase especial para esto? Pero veo ... Probablemente este uso no es tan frecuente o así. –

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

de javadoc en java.util.Collections#newSetFromMap(Map)

+4

en realidad cualquier conjunto en la colección java contiene un mapa para almacenar. – mart

+2

Sí, pero ¿por qué no hay una clase específica para ese tipo de cosas? –

+9

Es fácil imaginar por qué los mantenedores de java.util podrían haber querido dejar de tener que proporcionar versiones duales de Map y Set de todo lo que hacen, y optaron por simplemente proporcionar newSetFromMap() en su lugar ... ¿no es así? –

14

Entonces, ¿por qué no hay ningún WeakSet en el marco de recopilación de Java?

Aunque puede haber casos de uso limitado para WeakHashSet, que forma parte de la filosofía de diseño biblioteca de clases de Java era evitar poblar las bibliotecas de clases con clases de utilidad para todos los posibles casos de uso.

Existen otras bibliotecas de clases que incluyen tipos de colecciones; Las Colecciones de Apache Commons y las Colecciones de Google (también conocidas como Guava) son buenos ejemplos. Sin embargo, WeakHashSet ni siquiera "hizo el corte" para las bibliotecas de Apache y Google.

Y, por supuesto, puede usar Collections.newSetFromMap para envolver una instancia de WeakHashMap.

+0

Gracias. Probablemente necesito hacer más trabajo de observación sobre otras bibliotecas para comprender el marco de recopilación de Java. –

Cuestiones relacionadas