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