私はいくつかの時間を弱参照を使用することから利益を得ることができるいくつかの動作を実装しています。私は、クラスのユーザーが、これがそうであるかどうかを構築時に示すことができるようにしたいと思います。 WeakReference
が、私が(これは私が実際に何をしようとしているモックアップ、ではない)のような何かを行うことができ思える一見Reference
を拡張しているので:StrongReferenceオブジェクトがないのはなぜですか?
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
クラスがありません、とによりますReference javadocs:
したがって、オブジェクトに対する強い(つまり通常の)参照を保持する独自のサブクラスの参照を作成することはできません。これは、呼び出し元から弱い(または柔らかい)参照を使用するかどうかを隠すクラスを作成することはできないことを意味しているようです。参照オブジェクトはガベージコレクタと緊密に連携して実装されるため、このクラスを直接サブクラス化することはできません。
なぜこのクラスが存在しないのか分かりません。StrongReference
オブジェクトは、clear()が呼び出されていない限り、get()からオブジェクトを返すだけです。なぜこれが行方不明ですか? StrongReference
は何らかの形でReference
と矛盾していますか?一般的な参照ホルダオブジェクトを構築するのがずっと簡単になります。
本当に必要な場合は、その機能のインターフェイスを実装するのも簡単です。 –
はい、私は回避策があることを認識していますが、Java設計者がこの一見論理的なクラスを意図的に避けていると想定しています。 – dimo414
+1。また、強力でスレッドセーフな参照であるAtomicReferenceもありますが、同じインタフェースを実装していません。 – Thilo