0

假设我们必须有 WeakReference 和“强引用”列表的情况。但是 Java 中没有 StrongReference 类。我的解决方案是

保留对象列表

 List<? extends Object> list =new ArrayList();

当我们从列表中获取元素时,请检查:

if(list.get(i) instanceof WeakReference){
     MyClass myObject =  ((MyClass)((WeakReference) list.get(i)).get());
     if(myObject != null){
       myObject.doSomething();
     }
  }else{
     MyClass myObject =  ((MyClass)list.get(i));
     myObject.doSomething();
  } 

是否有更好的解决方案可以将强引用和弱引用放在一个集合中?

4

3 回答 3

3

我很想抽象出“强引用或弱引用”的概念:

public interface DualRef<T> {
    T get();
}

然后实现两个子类,一个用于弱引用:

public class WeakDualRef<T> implements DualRef<T> {
    private final WeakReference<T> mRef;
    public WeakDualRef(T object) {
        mRef = new WeakReference<T>(object);
    }
    public WeakDualRef(WeakReference<T> ref) {
        mRef = ref;
    }
    T get() {
        return mRef.get();
    }
}

另一个用于强参考:

public class StrongDualRef<T> implements DualRef<T> {
    private final T mRef;
    public StrongDualRef(T object) {
        mRef = object;
    }
    public T get() {
        return mRef;
    }
}

然后你可以将你的代码实现为:

List<DualRef<MyObject>> list = new ArrayList<DualRef<MyObject>>();

// add mixed instances of WeakDualRef<MyObject> or StringDualRef<MyObject> . . .

MyClass myObject = list.get(i).get();
myObject.doSomething();

所有这些都具有通过正确使用泛型来保持类型安全的优点。

于 2012-10-19T17:04:34.400 回答
0

混合类型不是一个好的概念。

List< WeakReference > weakRefs  = new ArrayList<>();
List< MyClass >       myClasses = new ArrayList<>();

用两个循环做两件不同的事情。

为什么混合两种不同类型的对象,它们不共享任何行为。

于 2012-10-19T17:03:56.117 回答
0

我会这样写

Object o = list.get(i);
if (o instanceof WeakReference) o = ((WeakReference) o).get();
if (o instanceof MyClass) ((MyClass) o).doSomething();
于 2012-10-19T17:10:09.000 回答