Dokumentacja biblioteki Java dla java.lang.refpakietu charakteryzuje malejącą siłę trzech jawnych typów odwołań.
Używasz a, SoftReferencegdy chcesz, aby obiekt, do którego istnieje odwołanie, pozostał aktywny, dopóki proces hosta nie będzie zabrakło pamięci. Obiekt nie będzie kwalifikował się do kolekcji aż kolektor potrzebuje do wolnej pamięci. Luźno sformułowane, wiązanie SoftReferenceoznacza: „Przypnij obiekt, dopóki nie będziesz mógł”.
Z drugiej strony, użyj a, WeakReferencegdy nie chcesz wpływać na czas życia obiektu, do którego się odwołuje; chcesz po prostu zrobić oddzielne stwierdzenie dotyczące obiektu, do którego się odwołujesz, dopóki pozostaje on żywy. Na kwalifikowalność obiektu do odbioru nie ma wpływu obecność związanych elementów WeakReference. Coś w rodzaju zewnętrznego mapowania z instancji obiektu na powiązaną właściwość, gdzie właściwość musi być rejestrowana tylko tak długo, jak powiązany obiekt żyje, jest dobrym zastosowaniem dla WeakReferences i WeakHashMap.
Ten ostatni… - PhantomReferencejest trudniejszy do scharakteryzowania. Na WeakReferenceprzykład takie ograniczenie PhantomReferencenie ma wpływu na żywotność obiektu, do którego się odwołuje. Ale w przeciwieństwie do innych typów referencyjnych, nie można nawet wyłuskać a PhantomReference. W pewnym sensie nie wskazuje na to, na co wskazuje, o ile dzwoniący mogą powiedzieć. Pozwala tylko na powiązanie pewnych powiązanych danych z obiektem, do którego się odwołuje - danymi, które mogą być później sprawdzane i wykonywane, gdy zostaną PhantomReferenceumieszczone w kolejce w powiązanych z nimi obiektach ReferenceQueue. Zwykle typ pochodzi z PhantomReferencetego typu pochodnego i zawiera dodatkowe dane. Niestety, użycie takiego typu pochodnego wymaga pewnych ograniczeń.
W Twoim przykładowym kodzie to nie refodwołanie (lub, jeśli wolisz, „zmienna”), które może mieć wartość null. Jest to raczej wartość uzyskana przez wywołanie, Reference#get()która może być zerowa. Jeśli okaże się, że jest zerowy, jesteś za późno; obiekt, do którego istnieje odwołanie, jest już w drodze do pobrania:
final String val = ref.get();
if (null != val)
{
}
else
{
}
WeakHashMapale nieSoftHashMaplubPhantomHashMapdoskonałe, dlaczego wcześniej tego nie zauważyłem .. ??