Sto implementando un comportamento che potrebbe trarre vantaggio dall'uso di riferimenti deboli in alcuni casi. Vorrei che l'utente della classe fosse in grado di indicare al momento della costruzione se questo è il caso o meno. Dal momento che si estende WeakReference
Reference
a prima vista sembrerebbe avrei potuto fare qualcosa di simile (questo è un mockup, non quello che sto effettivamente cercando di fare):Perché non esiste un oggetto 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();
}
}
Tuttavia non v'è alcuna StrongReference
di classe, e secondo la Reference javadocs:
Poiché gli oggetti di riferimento sono attuate in stretta cooperazione con il garbage collector, questa classe non può essere derivata direttamente.
Quindi non posso creare la mia sottoclasse di riferimento che contiene un riferimento forte (ovvero normale) all'oggetto. Ciò sembra significare che non è possibile creare una classe che nasconde se utilizza i riferimenti Weak (o Soft) dal chiamante.
Non capisco veramente perché questa classe non esiste, un oggetto StrongReference
deve semplicemente restituire sempre l'oggetto da get() a meno che clear() non sia stato chiamato. Perché manca questo? È un StrongReference
incoerente con Reference
in qualche modo? Sarebbe molto più semplice costruire oggetti di riferimento generici.
è anche banale implementare un'interfaccia per tale funzionalità se davvero ne hai bisogno. –
Sì, mi rendo conto che ci sono soluzioni alternative, ma presumo che i progettisti Java abbiano evitato intenzionalmente di includere questa classe apparentemente logica, e mi chiedo perché l'abbiano fatto. – dimo414
+1. Esiste anche AtomicReference, che è un riferimento sicuro e sicuro per i thread, ma non implementa la stessa interfaccia. – Thilo