Dokumentacja biblioteki Java dla java.lang.ref
pakietu charakteryzuje malejącą siłę trzech jawnych typów odwołań.
Używasz a, SoftReference
gdy 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 SoftReference
oznacza: „Przypnij obiekt, dopóki nie będziesz mógł”.
Z drugiej strony, użyj a, WeakReference
gdy 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 WeakReference
s i WeakHashMap
.
Ten ostatni… - PhantomReference
jest trudniejszy do scharakteryzowania. Na WeakReference
przykład takie ograniczenie PhantomReference
nie 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ą PhantomReference
umieszczone w kolejce w powiązanych z nimi obiektach ReferenceQueue
. Zwykle typ pochodzi z PhantomReference
tego typu pochodnego i zawiera dodatkowe dane. Niestety, użycie takiego typu pochodnego wymaga pewnych ograniczeń.
W Twoim przykładowym kodzie to nie ref
odwoł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
{
}
WeakHashMap
ale nieSoftHashMap
lubPhantomHashMap
doskonałe, dlaczego wcześniej tego nie zauważyłem .. ??