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)
 
         
                                         
                                         
                                         
                                        ![Interactive visualization of a graph in python [closed]](https://www.devze.com/res/2023/04-10/09/92d32fe8c0d22fb96bd6f6e8b7d1f457.gif) 
                                         
                                         
                                         
                                         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论