弱参照を使用することでメリットが得られる動作を実装しています。クラスのユーザーは、これが当てはまるかどうかを構築時に示すことができるようにしたいと思います。一見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
これにより、一般的な参照ホルダーオブジェクトの作成がはるかに簡単になります。