"Witam ponownie!"

„Teraz opowiem wam o jeszcze jednej cudownej rzeczy: WeakReference ”.

„Wygląda prawie tak samo jak SoftReference:”

Przykład
// Create a Cat object
Cat cat = new Cat();

// Create a weak reference to a Cat object
WeakReference<Cat> catRef = new WeakReference<Cat>(cat);

// Now only the catRef weak reference points at the object
cat = null;

// Now the ordinary cat variable also references the object
cat = catRef.get();

// Clear the weak reference
catRef.clear();

„Słaba referencja ma jeszcze jedną szczególną cechę”.

„Jeśli obiekt nie ma zwykłych lub miękkich odniesień, ale tylko słabe odniesienia, wówczas obiekt żyje, ale zostanie zniszczony przy następnym wyrzucaniu elementów bezużytecznych”.

„Czy możesz to powtórzyć? Jaka jest różnica między tymi odniesieniami?”

„Obiekt chroniony przed śmiercią tylko przez SoftReference może przetrwać tyle śmieci , ile chcesz i prawdopodobnie zostanie zniszczony, jeśli będzie za mało pamięci”.

„Obiekt chroniony przed śmiercią tylko przez WeakReference nie przetrwa następnego wyrzucania elementów bezużytecznych. Ale dopóki to się nie stanie, możesz pobrać obiekt, wywołując metodę get() na WeakReference, a następnie wywołać jego metody lub zrobić z nim coś innego ”.

„Co jeśli do obiektu odwołuje się zarówno SoftReference, jak i WeakReference?”

„To proste. Jeśli co najmniej jedno regularne odniesienie wskazuje na obiekt, uważa się go za żywy. Nawiasem mówiąc, takie odniesienie nazywa się StrongReference”.

„Jeśli żadne regularne odniesienia nie wskazują na obiekt, ale SoftReference tak, to jest on miękko osiągalny”.

„Jeśli żadne regularne odniesienia lub SoftReferences nie wskazują na obiekt, ale WeakReference tak, oznacza to, że jest on słabo osiągalny”.

„Pomyśl o tym. SoftReference chroni obiekt przed usunięciem i zapewnia, że ​​obiekt zostanie usunięty tylko wtedy, gdy zabraknie pamięci. WeakReference przetrzymuje obiekt do następnego wyrzucenia śmieci. SoftReference zapewnia większą odporność na usunięcie”.

– Ach. Chyba rozumiem.

„Świetnie, w takim razie opowiem ci o kolejnej interesującej rzeczy związanej z WeakReferences — WeakHashMap”.

"Brzmi poważnie!"

„A potem trochę! WeakHashMap to HashMap, której klucze są słabymi referencjami (WeakReferences).”

„Oznacza to, że dodajesz obiekty do takiej HashMapy i pracujesz z nimi. Biznes jak zwykle”.

„Tak długo, jak obiekty, które przechowujesz w WeakHashMap, mają regularne (silne lub miękkie) odniesienia jako klucze, obiekty te będą żywe”.

„Ale przypuśćmy, że w całej aplikacji nie ma już żadnych odniesień do tych obiektów. Wszystko, co powstrzymuje je przed śmiercią, to kilka WeakReferences wewnątrz WeakHashMap. Po następnym wyrzuceniu śmieci takie obiekty znikną z WeakHashMap. Same z siebie. nigdy tam nie było”.

— Nie jestem pewien, czy zrozumiałem.

„W WeakHashMap przechowujesz pary obiektów: klucz i wartość. Ale WeakHashMap nie odwołuje się bezpośrednio do kluczy, ale raczej przez WeakReferences. Dlatego, gdy obiekty używane jako klucze stają się słabo dostępne, są niszczone przy następnej wyrzucanie elementów bezużytecznych. W rezultacie ich wartości są również automatycznie usuwane z mapy WeakHashMap”.

„Bardzo wygodne jest używanie mapy WeakHashMap do przechowywania dodatkowych informacji o określonych obiektach”.

„Po pierwsze, dostęp do informacji jest bardzo łatwy, jeśli użyjesz samego obiektu jako klucza”.

„Po drugie, jeśli obiekt zostanie zniszczony, znika z HashMap wraz ze wszystkimi powiązanymi danymi”.

"Na przykład:

Przykład
// Create an object to store additional information about the user
WeakHashMap<User, StatisticInfo> userStatistics = new WeakHashMap<User, StatisticInfo>();

// Put information about the user into userStatistics
User user = session.getUser();
userStatistics.put(user, new StatisticInfo ());

// Get information about the user from userStatistics
User user = session.getUser();
StatisticInfo statistics = userStatistics.get(user);

// Remove any information about the user from userStatistics
User user = session.getUser();
userStatistics.remove(user);
  1. „WeakHashMap, klucze są przechowywane jako WeakReferences.”
  2. „Gdy tylko obiekt użytkownika zostanie zniszczony przez moduł wyrzucania elementów bezużytecznych, metoda remove(user) jest niejawnie wywoływana wewnątrz WeakHashMap, a wszelkie informacje związane z obiektem użytkownika są automatycznie usuwane z WeakHashMap”.

„To wygląda na potężne narzędzie. Gdzie mogę go użyć?”

„To zależy od okoliczności. Powiedzmy, że masz wątek w programie, który śledzi pracę niektórych zadań reprezentowanych przez obiekty i zapisuje informacje o nich w dzienniku. Ten wątek mógłby przechowywać monitorowane obiekty w WeakHashMap. ponieważ obiekty nie są potrzebne, moduł wyrzucania elementów bezużytecznych usuwa je, a odniesienia do nich są również automatycznie usuwane z mapy WeakHashMap”.

„Brzmi interesująco. Już czuję, że nie napisałem jeszcze żadnego poważnego programu w Javie, który korzystałby z tak potężnych mechanizmów. Ale będę nad tym pracował. Wielkie dzięki, Ellie, za tak interesującą lekcję”.