java collections garbage-collection weak-references

java - ¿Por qué existe WeakHashMap, pero ausente WeakSet?



collections garbage-collection (4)

De J. Bloch

Una ... fuente de pérdidas de memoria es la de los oyentes ... La mejor forma de garantizar que las devoluciones de llamadas se recojan de forma inmediata es almacenar solo referencias débiles, por ejemplo, almacenándolas solo como claves en un WeakHashMap .

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


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

La única respuesta realmente correcta es que no podemos decirte por qué porque no somos las personas que tomaron las decisiones de diseño. Solo los diseñadores de Java saben por qué tomaron la decisión 1 .

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

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

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

1 - Debatir sobre la exactitud de esa decisión está fuera del alcance de . Este es un sitio de preguntas y respuestas, no un foro de discusión.


Si bien puede usar Collections.newSetFromMap() para obtener un WeakSet, sus casos de uso son realmente bastante limitados.

Si desea implementar algo como String.intern() , puede que quiera echar un vistazo a la funcionalidad String.intern() Guava.


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


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

Como se ve en la documentación de Collections.newSetFromMap , pasar un WeakHashMap para obtener un Set .