Wdrażam pewne zachowanie, które może korzystać z używania słabych odniesień przez pewien czas. Chciałbym, aby użytkownik klasy mógł w czasie budowy wskazać, czy tak jest, czy nie. Od WeakReference
rozciąga Reference
na pierwszy rzut oka wydaje się, mogę zrobić coś takiego (jest to makieta, a nie to, co ja rzeczywiście próbuje zrobić):Dlaczego nie ma obiektu 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();
}
}
Jednak nie ma StrongReference
klasy i zgodnie z Reference javadocs:
Ponieważ obiekty referencyjne są implementowane w ścisłej współpracy z modułem czyszczącym, ta klasa nie może być poddana subklasie bezpośrednio.
Nie mogę utworzyć własnej podklasy Referencji, która zawiera silne (tj. Normalne) odniesienie do obiektu. Wydaje się to oznaczać, że nie można utworzyć klasy, która ukrywa, czy używa odwołań Słaby (lub Miękki) od dzwoniącego.
Nie do końca rozumiem, dlaczego ta klasa nie istnieje, obiekt StrongReference
powinien po prostu zawsze zwracać obiekt z get(), chyba że wywołano metodę clear(). Dlaczego tego brakuje? Czy StrongReference
jest niespójne z Reference
w jakiś sposób? To znacznie uprościłoby budowanie ogólnych obiektów odniesienia.
To także trywialne, aby zaimplementować interfejs dla tej funkcji, jeśli naprawdę jej potrzebujesz. –
Tak, zdaję sobie sprawę, że istnieją obejścia, ale zakładam, że projektanci Javy celowo uniknęli tej pozornie logicznej klasy i zastanawiam się, dlaczego to zrobili. – dimo414
+1. Istnieje również AtomicReference, która jest silnym i bezpiecznym odnośnikiem, ale nie implementuje tego samego interfejsu. – Thilo