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 SoftReferencecuando 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 SoftReferencemedio, "Fija el objeto hasta que no puedas más".
Por el contrario, utilice a WeakReferencecuando 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 WeakReferences y WeakHashMap.
El último ... PhantomReferencees más difícil de caracterizar. Por WeakReferenceejemplo, tal límite PhantomReferenceno 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 PhantomReferencese pone en cola en su relacionado ReferenceQueue. Normalmente, se deriva un tipo PhantomReferencee 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 refreferencia (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
{
}
WeakHashMappero noSoftHashMapoPhantomHashMapExcelente, por qué no me di cuenta de esto antes ... ??