La bibliothèque Java de la documentation pour l' java.lang.ref
package caractérise la diminution de la force des trois explicite des types référence.
Vous utilisez un SoftReference
lorsque vous souhaitez que l'objet référencé pour rester en vie jusqu'à ce que le processus hôte est en cours d'exécution faible sur la mémoire. L'objet ne seront pas admissibles pour la collecte jusqu'à ce que le collecteur de besoins pour libérer de la mémoire. Vaguement dit, la liaison d'un SoftReference
"signifie" Pin de l'objet jusqu'à ce que vous ne pouvez pas plus."
En revanche, l'utilisation d'un WeakReference
lorsque vous ne voulez pas de l'influence de l'objet référencé de la vie; vous voulez simplement faire un autre affirmation à propos de l'objet référencé, tant qu'il reste en vie. L'objet d'admissibilité pour la collecte n'est pas influencée par la présence de liés WeakReference
s. Quelque chose comme un mapping externe de l'objet de l'instance liée à la propriété, d'où la propriété doit être enregistrée tant que l'objet est vivant, est un bon usage pour WeakReference
s et WeakHashMap
.
Le dernier-PhantomReference
-est plus difficile à caractériser. Comme WeakReference
, une telle liés PhantomReference
n'a pas d'influence sur l'objet référencé de sa vie. Mais contrairement aux autres types de référence, on peut même pas déréférencer un PhantomReference
. Dans un sens, il n'a pas de point à la chose dont il points de, autant que les appelants peuvent le dire. Il permet simplement à l'un d'associer certaines données liées à l'objet référencé -- données qui peuvent ensuite être inspectées et traitées lorsque l' PhantomReference
obtient en file d'attente dans ses ReferenceQueue
. Normalement, on tire d'un type d' PhantomReference
et contient d'autres données de ce type dérivé. Malheureusement, il y a un peu de passer participé à faire de l'utilisation d'un tel type dérivé.
Dans votre exemple de code, il n'est pas l' ref
de référence (ou, si vous préférez, "variable") qui peut être null. Plutôt, c'est la valeur obtenue en appelant Reference#get()
qui peut être null. Si elle est jugée nulle, vous êtes trop tard, l'objet référencé est déjà sur sa façon d'être recueillis:
final String val = ref.get();
if (null != val)
{
// "val" is now pinned strongly.
}
else
{
// "val" is already ready to be collected.
}