"Здравей отново!"

„Сега ще ви разкажа за още едно прекрасно нещо: WeakReference .“

„Изглежда почти същото като SoftReference:“

Пример
// 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();

„Слабата референция има друга особеност.“

„Ако даден обект няма обикновени препратки or меки препратки, а само слаби препратки, тогава обектът е жив, но ще бъде унищожен при следващото събиране на боклука.“

"Можете ли да го повторите? Каква е разликата между тези препратки?"

„Един обект, предпазен от смърт само от SoftReference , може да преживее колкото искате събирания на боклук и вероятно ще бъде унищожен, ако няма достатъчно памет.“

„Обект, предпазен от смърт само от WeakReference , няма да оцелее при следващото събиране на отпадъци. Но докато това се случи, можете да получите обекта, като извикате метода get() на WeakReference и след това извикате неговите методи or направите нещо друго с него ."

„Ами ако обектът е рефериран от SoftReference и WeakReference?“

"Това е просто. Ако поне една редовна препратка сочи към обект, той се счита за жив. Между другото, такава препратка се нарича StrongReference."

„Ако няма редовни препратки, сочещи към обект, но SoftReference сочи, тогава той е лесно достъпен.“

„Ако няма редовни препратки or SoftReferences да сочат към обект, но WeakReference го прави, тогава той е слабо достъпен.“

„Помислете за това. SoftReference защитава обекта от изтриване и гарантира, че обектът ще бъде изтрит само ако няма достатъчно памет. WeakReference задържа обекта до следващото събиране на отпадъци. SoftReference предлага по-голяма устойчивост на изтриване.“

— А, мисля, че разбирам.

„Супер, тогава ще ви разкажа за друго интересно нещо, свързано с WeakReferences – WeakHashMap.“

— Звучи сериозно!

„И след това малко! WeakHashMap е HashMap, чиито ключове са слаби препратки (WeakReferences).“

„Тоест вие добавяте обекти към такъв HashMap и работите с тях. Бизнес Howто обикновено.“

„Докато обектите, които съхранявате в WeakHashMap, имат редовни (силни or меки) препратки като ключове, тези обекти ще бъдат живи.“

„Но да предположим, че няма повече препратки към тези обекти в цялото приложение. Всичко, което ги предпазва от смъртта, са няколко WeakReferences вътре в WeakHashMap. След следващото събиране на боклук, такива обекти ще изчезнат от WeakHashMap. Сами по себе си. Сякаш те никога не са бor там."

— Не съм сигурен, че разбрах.

„Вие съхранявате двойки обекти в WeakHashMap: ключ и стойност. Но WeakHashMap не препраща директно към ключовете, а по-скоро чрез WeakReferences. Следователно, когато обектите, използвани като ключове, станат слабо достъпни, те се унищожават на следващия събиране на отпадъци. И в резултат на това техните стойности също се премахват автоматично от WeakHashMap."

„Много е удобно да се използва WeakHashMap за съхраняване на допълнителна информация за определени обекти.“

„Първо, достъпът до информацията е много лесен, ако използвате самия обект като ключ.“

„Второ, ако обектът бъде унищожен, той изчезва от HashMap заедно с всички свързани данни.“

"Например:

Пример
// 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 ключовете се съхраняват като WeakReferences.“
  2. „Веднага след като потребителският обект бъде унищожен от събирача на отпадъци, методът за премахване (потребител) се извиква имплицитно вътре в WeakHashMap и всяка информация, свързана с потребителския обект, се премахва автоматично от WeakHashMap.“

„Това изглежда като мощен инструмент. Къде мога да го използвам?“

„Това зависи от обстоятелствата. Да кажем, че имате нишка в програмата, която проследява работата на някои задачи, представени от обекти, и записва информация за тях в журнал. Тази нишка може да съхранява наблюдаваните обекти в WeakHashMap. тъй като обектите не са необходими, събирачът на отпадъци ги изтрива и препратките към тях също се премахват автоматично от WeakHashMap."

„Звучи интересно. Вече имам чувството, че все още не съм написал ниHowви сериозни Java програми, които да се възползват от толкова мощни механизми. Но ще работя за това. Благодаря много, Ели, за толкова интересен урок.“