Według the source code używa klasy PhantomReference. Zgodnie z dokumentacją:
Przedmioty fantomowe, które są zakotwiczone po kolektorze, określają, że ich referencje mogą zostać odzyskane. Odnośniki widmowe są najczęściej używane do planowania akcji oczyszczania przedśmiertnego w bardziej elastyczny sposób niż jest to możliwe w przypadku mechanizmu finalizacji Java.
Jeśli odśmiecacz określi w pewnym momencie, że odniesienie fantomowego odniesienia jest fantomem osiągalne, to w tym czasie lub w pewnym późniejszym momencie spowoduje ono dodanie do zbioru odniesienia.
Aby zapewnić, że obiekt podlegający odzyskaniu pozostanie taki, odniesienie odwołania fantomowego może nie zostać odzyskane: Metoda get odwołania fantomowego zawsze zwraca wartość null.
W odróżnieniu od miękkich i słabych odniesień odniesienia fantomowe nie są automatycznie usuwane przez kolektor śmieci podczas ich kolejkowania. Obiekt, do którego można dotrzeć za pomocą fantomowych odniesień, pozostanie taki, dopóki wszystkie takie odniesienia nie zostaną wyczyszczone lub same nie będą dostępne.
Konstruktor PhantomReference
dwa argumenty:
referent
- przedmiot nowe odniesienie fantomowego będzie odnosić się do
q
- kolejkę w którym skierowana jest do rejestracji, lub zerowy, jeżeli rejestracja nie jest wymagana
Argument q
jest inst z klasy ReferenceQueue
. Numer PhantomReference
zostanie dodany do tego ReferenceQueue
, gdy stanie się fantomowo osiągalny. W takim przypadku można odzyskać PhantomReference
, stosując metody poll()
lub klasy ReferenceQueue
.
Na przykład:
T objectToWatch = ...;
ReferenceQueue<T> referenceQueue = new ReferenceQueue<T>();
new PhantomReference<T>(objectToWatch, referenceQueue);
// Later on, probably in another thread...
Reference<? extends T> nextReference = referenceQueue.remove();
// Tidy up!
Uwaga: PhantomReference
ma rodzeństwo klas nazwanych SoftReference
i WeakReference
, które mogą być również użyteczne. Relacje między nimi są udokumentowane w java.lang.ref package documentation.
Nie używaj finalizatorów do tego celu ani żadnego innego, jeśli możesz tego uniknąć. Nie ma gwarancji, że metoda finalize() zostanie wywołana natychmiast po wyrzuceniu elementów do śmieci lub nawet, że zostanie wywołana w ogóle (patrz Efektywna Java 2nd Ed, pozycja 7). Pakiet java.lang.ref jest drogą. – Leigh
Jeśli możesz pomóc, nie używaj finalizatorów! http://stackoverflow.com/a/158791/74694 –