2011-06-09 8 views
7

Tengo una lista de weakReferences para objetos en java. ¿Cómo escribo un método que obtiene la instancia del objeto real y elimina su referencia débil de esta lista?¿Cómo eliminar una referencia débil de una lista?

gracias.

+0

¿Se refiere a un método que toma el fuerte referencia de objeto como un parámetro? –

Respuesta

34

No está del todo claro a qué se refiere, pero creo que se puede desear:

public static <T> void removeReference(List<WeakReference<T>> list, 
             T reference) 
{ 
    for (Iterator<WeakReference<T>> iterator = list.iterator(); 
     iterator.hasNext();) 
    { 
     WeakReference<T> weakRef = iterator.next(); 
     if (weakRef.get() == reference) 
     { 
      iterator.remove(); 
     } 
    } 
} 
+6

también podría eliminar las vulnerabilidades nulas mientras está en ello –

+1

@ratchet: Me pregunté sobre eso, pero depende de lo que el OP intente hacer. –

+0

¿Cómo se elimina un elemento nulo de la lista? 'if (weakRef.get() == null)'? –

6

Tener un vistazo a la Javadocs para WeakReference. Dos cosas importantes a tener en cuenta: 1. que está protegido, por lo que se pueden extender, y 2. No exime Object.equals()

Así, dos enfoques para hacer lo que quiere:

Primero, de la manera más simple, usa lo que dice @Jon Skeet.

Segundo, forma más elegante. Nota: esto sólo funciona si usted es el único que añadir a la lista también:

public class HardReference<T> { 
    private final T _object; 

    public HardReference(T object) { 
    assert object != null; 
    _object = object; 
    } 

    public T get() { return _object; } 

    public int hashCode() { return _object.hashCode(); } 

    public boolean equals(Object other) { 
    if (other instanceof HardReference) { 
     return get() == ((HardReference) other).get(); 
    } 
    if (other instanceof Reference) { 
     return get() == ((Reference) other).get(); 
    } 
    return get() == other; 
    } 
} 

class WeakRefWithEquals<T> extends WeakReference<T> { 

    WeakRefWithEquals(T object) { super(object); } 

    public boolean equals(Object other) { 
    if (other instanceof HardReference) { 
     return get() == ((HardReference) other).get(); 
    } 
    if (other instanceof Reference) { 
     return get() == ((Reference) other).get(); 
    } 
    return get() == other; 
    } 
} 

Una vez que tenga estas clases de utilidad, se puede envolver objetos almacenados en listas, mapas, etc. con cualquier subclase de referencia - como los WeakRefWithEquals ejemplo de arriba Cuando se busca un elemento, es necesario envolver HardReference, por si acaso la implementación de la colección hace

param.equals(element) 

en lugar de

element.equals(param) 
Cuestiones relacionadas