relacionadas: Does java have a "LinkedConcurrentHashMap" data structure?clase de colección Adecuado para los detectores de eventos en Java
Busco a una clase de colección para mantener las referencias a los detectores de eventos.
Idealmente me gustaría la colección a tener las siguientes propiedades (en orden de prioridad):
- mantiene el orden de inserción. Los oyentes anteriores pueden cancelar el evento, evitando que se entregue a los oyentes añadidos más tarde. Esto se romperá si se usa una clase como
HashSet
cuyo iterador puede devolver elementos en el orden incorrecto. - Usa
WeakReference
s para que la lista de escucha no impida que los oyentes se recojan basura. - La colección es
Set
, por lo que los duplicados se eliminan automáticamente. Iterator
es una instantánea segura de subprocesos de la colección, no se ve afectada por la adición de nuevos oyentes. También permite que los eventos se entreguen en múltiples hilos. (Esto no es esencial; podría iterar sobre un clon del conjunto).
Conozco algunas clases que satisfacen algunos de estos criterios, pero no todos. Ejemplos:
java.util.LinkedHashSet
(# 1 y # 3)java.util.WeakHashMap
, envuelto porCollections.newSetFromMap
(# 2 y # 3)javax.swing.event.EventListenerList
(necesita un poco de sincronización extra) (# 1 y # 4)java.util.concurrent.CopyOnWriteArraySet
(# 1, # 3 y # 4)
Pero nada con ambos # 1 y # 2. ¿Existe una clase como esta en alguna biblioteca?
¿Es realmente típico para los objetos del oyente implementar 'iguales'? –
Además, ¿de quién es el trabajo de retener una referencia fuerte para cada oyente? Si escribiera un oyente para registrar varios eventos y registrarlo, ¡me sorprendería que desapareciera repentinamente unos minutos más tarde! –
No el problema con equals es: '{Object o = new Object(); WeakReference r1 = new WeakReference (o), r2 = new WeakReference (o); return r1.equals (r2);} 'returns' false' – finnw