开发者

How to remove a weakReference from a list?

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?

thank开发者_JAVA百科s.


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


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)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜