La documentación de lajava.lang.ref
biblioteca de Java para el paquete caracteriza la fuerza decreciente de los tres tipos de referencia explícitos.
Utiliza un SoftReference
cuando desea que el objeto referenciado permanezca activo hasta que el proceso del host se esté quedando sin memoria. El objeto no será elegible para la recopilación hasta que el recopilador necesite liberar memoria. Enunciado libremente, vincular un SoftReference
medio, "Fija el objeto hasta que no puedas más".
Por el contrario, utilice a WeakReference
cuando no desee influir en la vida útil del objeto al que se hace referencia; simplemente desea hacer una afirmación separada sobre el objeto al que se hace referencia, siempre que permanezca vivo. La elegibilidad del objeto para la colección no está influenciada por la presencia de enlaces WeakReference
. Algo así como un mapeo externo de la instancia del objeto a la propiedad relacionada, donde la propiedad solo necesita registrarse mientras el objeto relacionado esté vivo, es un buen uso para WeakReference
s y WeakHashMap
.
El último ... PhantomReference
es más difícil de caracterizar. Por WeakReference
ejemplo, tal límite PhantomReference
no ejerce ninguna influencia en la vida útil del objeto referenciado. Pero a diferencia de los otros tipos de referencia, ni siquiera se puede eliminar la referencia a PhantomReference
. En cierto sentido, no apunta a lo que apunta, por lo que las personas que llaman pueden saber. Simplemente le permite a uno asociar algunos datos relacionados con el objeto referenciado, datos que luego se pueden inspeccionar y actuar sobre ellos cuando PhantomReference
se pone en cola en su relacionado ReferenceQueue
. Normalmente, se deriva un tipo PhantomReference
e incluye algunos datos adicionales en ese tipo derivado. Desafortunadamente, hay algo de abatimiento involucrado para hacer uso de un tipo derivado.
En su código de ejemplo, no es la ref
referencia (o, si lo prefiere, la "variable") la que puede ser nula. Más bien, es el valor obtenido al llamar Reference#get()
que puede ser nulo. Si se determina que es nulo, es demasiado tarde; el objeto referenciado ya está en camino de ser recopilado:
final String val = ref.get();
if (null != val)
{
}
else
{
}
WeakHashMap
pero noSoftHashMap
oPhantomHashMap
Excelente, por qué no me di cuenta de esto antes ... ??