"Buna din nou!"

„Acum am să vă spun despre încă un lucru minunat: WeakReference ”.

„Arata aproape la fel ca SoftReference:”

Exemplu
// 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();

„O referință slabă are o altă caracteristică specială”.

„Dacă un obiect nu are referințe obișnuite sau referințe soft, ci doar referințe slabe, atunci obiectul este viu, dar va fi distrus la următoarea colectare a gunoiului.”

"Poți să mai spui asta? Care este diferența dintre aceste referințe?"

„Un obiect ținut de moarte doar de către un SoftReference poate supraviețui la câte colecții de gunoi doriți și probabil va fi distrus dacă nu există memorie suficientă.”

„Un obiect ținut de moarte doar de către un WeakReference nu va supraviețui următoarei colectări de gunoi. Dar până când se întâmplă asta, puteți obține obiectul apelând metoda get() de pe WeakReference și apoi apelați metodele sale sau făcând altceva cu el. ."

„Ce se întâmplă dacă obiectul este referit atât de către SoftReference, cât și de către WeakReference?”

"Asta este simplu. Dacă cel puțin o referință obișnuită indică către un obiect, acesta este considerat viu. Apropo, o astfel de referință se numește StrongReference."

„Dacă nicio referință obișnuită nu indică către un obiect, dar o referință Soft, atunci este ușor accesibil.”

„Dacă nicio referință obișnuită sau SoftReferences nu indică către un obiect, dar un WeakReference face, atunci este slab accesibil.”

"Gândiți-vă la asta. O referință Soft protejează obiectul de a fi șters și asigură că obiectul va fi șters doar dacă nu există memorie suficientă. O referință slabă păstrează obiectul până la următoarea colectare a gunoiului. O referință Soft oferă o rezistență mai mare la ștergere."

— Ah. Cred că înţeleg.

„Bine, atunci vă voi spune despre un alt lucru interesant care implică WeakReferences – WeakHashMap.”

— Sună grav!

„Și apoi niște! Un WeakHashMap este un HashMap ale cărui chei sunt referințe slabe (WeakReferences).”

„Adică adăugați obiecte la un astfel de HashMap și lucrați cu ele. Afaceri ca de obicei.”

„Atâta timp cât obiectele pe care le stocați într-un WeakHashMap au referințe regulate (puternice sau soft) ca chei, aceste obiecte vor fi vii.”

„Dar să presupunem că nu mai există referințe la aceste obiecte în întreaga aplicație. Tot ceea ce le împiedică să moară sunt câteva WeakReferences în interiorul WeakHashMap. După următoarea colectare de gunoi, astfel de obiecte vor dispărea din WeakHashMap. De la sine. Ca și cum ar fi nu au fost niciodată acolo.”

— Nu sunt sigur că am înțeles.

„Într-un WeakHashMap stocați perechi de obiecte: o cheie și o valoare. Dar WeakHashMap nu face referire la chei direct, ci mai degrabă prin WeakReferences. Prin urmare, atunci când obiectele folosite ca chei devin slab accesibile, ele sunt distruse la următoarea colectarea gunoiului. Și, ca rezultat, valorile lor sunt, de asemenea, eliminate automat din WeakHashMap."

„Este foarte convenabil să folosești un WeakHashMap pentru a stoca informații suplimentare despre anumite obiecte.”

„În primul rând, accesarea informațiilor este foarte ușoară dacă folosești obiectul în sine ca cheie”.

„În al doilea rând, dacă obiectul este distrus, acesta dispare din HashMap împreună cu toate datele asociate.”

"De exemplu:

Exemplu
// 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. „În interiorul unui WeakHashMap, cheile sunt stocate ca WeakReferences.”
  2. „De îndată ce obiectul utilizator este distrus de către colectorul de gunoi, metoda remove(user) este apelată implicit în WeakHashMap și orice informație asociată cu obiectul utilizator este eliminată automat din WeakHashMap.”

„Acesta pare un instrument puternic. Unde îl pot folosi?”

„Asta depinde de circumstanțe. Să presupunem că aveți un thread în program care urmărește munca unor sarcini, reprezentate de obiecte, și scrie informații despre ele într-un jurnal. Acest thread ar putea stoca obiectele monitorizate într-un WeakHashMap. În curând deoarece obiectele nu sunt necesare, colectorul de gunoi le șterge, iar referințele la ele sunt, de asemenea, eliminate automat din WeakHashMap.”

„Sună interesant. Am deja impresia că nu am scris încă niciun program Java serios care să profite de mecanisme atât de puternice. Dar voi lucra în acest sens. Mulțumesc mult, Ellie, pentru o lecție atât de interesantă.”