Документація бібліотеки Java для java.lang.refпакету характеризує зменшення сили трьох явних типів посилань.
Ви використовуєте, SoftReferenceколи ви хочете, щоб об'єкт, на який посилається, залишався живим, поки в хості не закінчиться обсяг пам'яті. Об’єкт не буде придатним для збору, доки колектору не буде потрібно звільнити пам’ять. Вільно висловлене, прив'язуючи SoftReferenceзасіб: "Закріпіть об'єкт, доки більше не зможете".
Навпаки, використовуйте a, WeakReferenceколи ви не хочете впливати на час життя об’єкта, на який посилається; ви просто хочете зробити окреме твердження про об’єкт, на який посилається, поки він залишається живим. На придатність об’єкта до збору не впливає наявність пов’язаних WeakReferences. Щось на зразок зовнішнього зіставлення з екземпляра об'єкта на пов'язану властивість, де властивість потрібно реєструвати лише доти, доки пов'язаний об'єкт живе, є хорошим використанням для WeakReferences і WeakHashMap.
Останній PhantomReference- важче охарактеризувати. Мовляв WeakReference, такий зв’язок PhantomReferenceне впливає на життя об’єкта, на який посилається. Але на відміну від інших еталонних типів, неможливо навіть розпізнати a PhantomReference. У певному сенсі це не вказує на те, на що вказує, наскільки можуть зрозуміти абоненти. Це просто дозволяє асоціювати деякі пов'язані дані з об'єктом, на який посилається - дані, які згодом можуть бути перевірені та реагувати на них, коли PhantomReferenceчерги потрапляють у відповідний зв’язок ReferenceQueue. Зазвичай один отримує тип із PhantomReferenceі включає деякі додаткові дані в цей похідний тип. На жаль, для використання такого похідного типу задіяно деяке зниження.
У вашому прикладі коду refнуль не може бути посиланням (або, якщо ви бажаєте, "змінною"). Швидше, це значення, отримане при виклику Reference#get(), може бути нульовим. Якщо воно виявиться нульовим, ви запізнилися; об’єкт, на який посилається, вже на шляху до збору:
final String val = ref.get();
if (null != val)
{
}
else
{
}
WeakHashMapале немаєSoftHashMapабоPhantomHashMapчудове запитання, чому я цього раніше не помічав .. ??