如何从列表中删除弱引用?

9
我有一个包含java对象弱引用的列表。 如何编写一个方法,获取实际对象实例并从该列表中删除它的弱引用? 谢谢。

你的意思是一个以强对象引用作为参数的方法吗? - Jon Skeet
2个回答

36

不太清楚您的意思,但我认为您可能想要:

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

7
在你进行操作时,你也可以删除已置空的 weakrefs。 - ratchet freak
1
@ratchet:我也有这个疑问,但这取决于原帖作者想要做什么。 - Jon Skeet
如何从列表中删除空元素?if (weakRef.get() == null) - Eduardo Bezerra
1
@EduardoBezerra:是的,我认为那应该没问题。 - Jon Skeet

6
请查看WeakReference的Javadocs。有两个重要的注意事项: 1.它是受保护的,所以您可以扩展它。 2.它不会覆盖Object.equals()。
因此,有两种方法可以实现您想要的功能: 首先,简单的方法,使用@Jon Skeet提到的方法即可。 其次,更优雅的方法。请注意:这仅在您是唯一添加到列表的人时才有效。
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;
  }
}

一旦您拥有这些实用类,您可以使用任何引用子类(如上面的WeakRefWithEquals示例)将存储在列表、映射等中的对象进行包装。 当您正在查找元素时,需要将其包装为HardReference,以防万一集合实现不会。
param.equals(element)

替代

element.equals(param)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接