19

弱参照を使用することでメリットが得られる動作を実装しています。クラスのユーザーは、これが当てはまるかどうかを構築時に示すことができるようにしたいと思います。一見WeakReference拡張するので、次のようなことができるように見えます(これはモックアップであり、実際にやろうとしていることではありません)。Reference

public class Container<T> {
    private boolean useWeakRef;
    private Reference<T> ref;

    public Container(boolean isWeak) {
        useWeakRef = isWeak;
    }

    public void store(T val) {
        if(useWeakRef) {
            ref = new WeakReference<>(val);
        } else {
            ref = new StrongReference<>(val);
        }
    }

    // May return null
    public T get() {
        return ref.get();
    }
}

ただし、StrongReferenceクラスはありません。リファレンスjavadocsによると:

参照オブジェクトはガベージコレクターと緊密に連携して実装されるため、このクラスを直接サブクラス化することはできません。

そのため、オブジェクトへの強力な(つまり通常の)参照を保持する独自のReferenceのサブクラスを作成することはできません。これは、呼び出し元からの弱い(またはソフト)参照を使用するかどうかを隠すクラスを作成できないことを意味しているようです。

このクラスが存在しない理由はよくわかりません。clear StrongReference()が呼び出されていない限り、オブジェクトは常にget()からオブジェクトを返す必要があります。なぜこれが欠けているのですか?何らかの形でStrongReference矛盾していますか?Referenceこれにより、一般的な参照ホルダーオブジェクトの作成がはるかに簡単になります。

4

3 に答える 3

4

これを行う必要があるときは、カスタム参照インターフェースとWeakReferenceの簡単なサブクラスを作成しました。それは迷惑ですが、あなたができることと同じくらい良いです。

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

public class MyWeakReference<T> extends WeakReference<T> implements MyReference<T> {
}

public class MyStrongReference<T> implements MyReference<T> {
  // obvious implementation here ...
}

アップデート:

明確にするために、これがそもそもjdkに含まれていなかった理由はわかりませんが(私も含まれていればよかったのですが)、これは合理的な回避策だと思います。

このアイデアの正当性を求める人のために、参照の強度がキャッシュの構成の一部であるカスタムキャッシュを実装するときに必要であることがわかりました。

于 2013-03-27T15:15:36.393 に答える
3

パブリック/保護されたコンストラクターがないため、Referenceをサブクラス化することはできません。ただし、回避策があります。

class StrongReference<T> extends WeakReference<T> {
    private final T referent;

    StrongReference(T referent) {
        super(null);
        this.referent = referent;
    }

    @Override
    public T get() {
        return referent;
    }

    // implement other methods
}
于 2013-03-27T05:49:50.397 に答える
1

Guava'sLocalCacheは、クラスに実行させStrongValueReferenceたいことを複製するクラスを使用StrongReferenceします。Guavaがこれをパブリッククラスとして公開していないのは残念ですが、これはJDKにない機能であり、必要に応じて複製しても問題がないことを確認するためのものです。

とは言うものの、使用している参照のタイプを抽象化する必要があるほとんどのユースケースは、私がそうであったように、 GuavaのCache動作を直接使用できる可能性があります。この質問に出くわした人は、この抽象的な参照動作自体を再発明する前に、Guavaの既存のキャッシュメカニズムを調べることをお勧めします。

于 2015-08-24T20:41:16.447 に答える