2012-10-19 119 views
0

假设中,我们必须拥有的WeakReference的名单和“强参照”。但也有在Java.My解决方案不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(); 
    } 

有没有更好的解决办法,以保持强和弱引用峠在一个集合?

回答

0

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

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

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

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

+0

对不起,“任何集合”是错误的,我不得不写有序集合:)。 – Ashot

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

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

0

我会写这样的事情

Object o = list.get(i); 
if (o instanceof WeakReference) o = ((WeakReference) o).get(); 
if (o instanceof MyClass) ((MyClass) o).doSomething();