Se il tuo obiettivo è solo quello di tenere un registro di quando gli oggetti non vengono più utilizzati, guarderei ReferenceQueue , che dovrebbe essere più efficiente dei tuoi loop costanti di Reference.isEnqueued()
checks.
La scelta su quale tipo di riferimento usare è più complicata e dipende da quando si desidera essere avvisati e dal tipo di informazioni sull'oggetto che è necessario rendere disponibile. In particolare, guarderei anche PhantomReference come alternativa a WeakReference.
È un po 'rotonda, ma aggiungi elementi a ReferenceQueue
passando la coda nel loro costruttore, per esempio:
Foo targetFoo; /* stuff */
ReferenceQueue<Object> refq = new ReferenceQueue<Object>();
WeakReference<Foo> pr = new WeakReference(targetFoo, refq);
In un thread separato, puoi eseguire il loop e attendere quando si verificano cambiamenti:
Reference<Object> ref = fooQueue.remove(); // Blocks, poll() is also possible
In questo modo, puoi avere un codice che monitora quando determinati oggetti non sono più strongmente raggiungibili.
PS: Dal momento che il% originale di co_de potrebbe essere effettivamente eliminato, un modo per mantenere le informazioni su di esso è creare la sottoclasse di Foo
, una che memorizza le informazioni su Reference
in modo che tu possa accedervi in seguito.
Foo targetFoo; /* stuff */
ReferenceQueue<Object> refq = new ReferenceQueue<Object>();
// Use custom subclass of WeakReference
MyReference<Foo> ref = new MyReference(targetFoo, refq);
ref.setStuff("hello");
// Later, in another thread, etc.
MyReference<Object> ref = (MyReference<Object>) fooQueue.remove();
String msg = ref.getStuff();