Документация библиотеки Java для пакета java.lang.ref
характеризует снижение силы трех явных ссылочных типов.
Вы используете SoftReference
, когда хотите, чтобы указанный объект оставался в живых до тех пор, пока процесс хоста не исчерпает память. Объект не будет иметь права на коллекцию, пока сборщику не понадобится для освобождения памяти. Проще говоря, привязка SoftReference
означает «Закрепить объект, пока вы больше не сможете».
Напротив, используйте WeakReference
, если вы не хотите влиять на время жизни ссылочного объекта; Вы просто хотите сделать отдельное утверждение о объекте, на который ссылаются, до тех пор, пока он остается живым. Право на получение объекта не зависит от наличия связанных WeakReference
s. Нечто подобное внешнему отображению экземпляра объекта в связанное свойство, где свойство нужно записывать только до тех пор, пока связанный объект жив, хорошо подходит для WeakReference
s и WeakHashMap
.
Последний - PhantomReference
- сложнее охарактеризовать. Как и WeakReference
, такая граница PhantomReference
не оказывает влияния на время жизни ссылочного объекта. Но в отличие от других ссылочных типов, нельзя даже разыменовать PhantomReference
. В некотором смысле, это не указывает на то, на что он указывает, насколько звонящие могут сказать. Он просто позволяет связать некоторые связанные данные со ссылочным объектом - данные, которые впоследствии могут быть проверены и обработаны, когда PhantomReference
ставится в очередь в связанном ReferenceQueue
. Обычно каждый получает тип из PhantomReference
и включает некоторые дополнительные данные в этот производный тип. К сожалению, для использования такого производного типа требуется некоторое уныние.
В вашем примере кода это не ссылка на ref
(или, если хотите, «переменная»), которая может быть нулевой. Скорее, это значение, полученное путем вызова Reference#get()
, может быть нулевым. Если он окажется нулевым, вы опоздали; указанный объект уже на пути к сбору:
final String val = ref.get();
if (null != val)
{
// "val" is now pinned strongly.
}
else
{
// "val" is already ready to be collected.
}