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)
精彩评论