9

I've got a list of weakReferences to objects in java. How do i write a method that gets the real object instance and removes it's weak reference from this list?

thanks.

Adibe7
  • 3,469
  • 7
  • 30
  • 36

2 Answers2

36

It's not entirely clear what you mean, but I think you may want:

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();
        }
    }
}
Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
6

Have a look at the Javadocs for WeakReference. Two important things to note: 1. it is protected, so you can extend it, and 2. it does not override Object.equals()

So, two approaches to do what you want:

First, the simple way, use what @Jon Skeet said.

Second, more elegant way. Note: this only works if you are the only one adding to the list too:

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;
  }
}

Once you have these utility classes, you can wrap objects stored in Lists, Maps etc with whatever reference subclass -- like the WeakRefWithEquals example above. When you are looking for an element, you need to wrap it HardReference, just in case the collection implementation does

param.equals(element)

instead of

element.equals(param)
Dilum Ranatunga
  • 13,254
  • 3
  • 41
  • 52