0

WeakReference と「Strong Reference」のリストが必要な状況を想定します。しかし、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();
  } 

強い参照と弱い参照を 1 つのコレクションにまとめるより良い解決策はありますか?

4

3 に答える 3

3

「強い参照または弱い参照」の概念を抽象化したくなるでしょう。

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

次に、2 つのサブクラスを実装します。1 つは弱参照用です。

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

もう 1 つは強い参照用です。

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

私はそれをこのように書くでしょう

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 に答える