Die Java-Bibliotheksdokumentation für das java.lang.ref
Paket kennzeichnet die abnehmende Stärke der drei expliziten Referenztypen.
Sie verwenden a, SoftReference
wenn das referenzierte Objekt so lange am Leben bleiben soll, bis der Host-Prozess fast keinen Speicher mehr hat. Das Objekt kann erst gesammelt werden, wenn der Kollektor Speicher freigeben muss . Locker gesagt, ein SoftReference
Mittel binden , "Pin das Objekt, bis Sie nicht mehr können."
Verwenden WeakReference
Sie im Gegensatz dazu a, wenn Sie die Lebensdauer des referenzierten Objekts nicht beeinflussen möchten. Sie möchten lediglich eine separate Aussage über das referenzierte Objekt machen, solange es am Leben bleibt. Die Berechtigung des Objekts zur Sammlung wird nicht durch das Vorhandensein gebundener WeakReference
s beeinflusst. So etwas wie eine externe Zuordnung von der Objektinstanz zu einer verwandten Eigenschaft, bei der die Eigenschaft nur aufgezeichnet werden muss, solange das verwandte Objekt lebt, ist eine gute Verwendung für WeakReference
s und WeakHashMap
.
Der letzte PhantomReference
ist schwerer zu charakterisieren. Eine WeakReference
solche Bindung hat PhantomReference
keinen Einfluss auf die Lebensdauer des referenzierten Objekts. Aber im Gegensatz zu den anderen Referenztypen kann man a nicht einmal dereferenzieren PhantomReference
. In gewissem Sinne zeigt es nicht auf das, worauf es zeigt, soweit Anrufer dies beurteilen können. Es ermöglicht lediglich das Verknüpfen einiger verwandter Daten mit dem referenzierten Objekt - Daten, die später überprüft und bearbeitet werden können, wenn das Objekt PhantomReference
in der zugehörigen Warteschlange in die Warteschlange gestellt wird ReferenceQueue
. Normalerweise leitet man einen Typ von PhantomReference
diesem abgeleiteten Typ ab und enthält einige zusätzliche Daten. Leider ist ein Downcasting erforderlich, um einen solchen abgeleiteten Typ zu verwenden.
In Ihrem Beispielcode kann nicht die ref
Referenz (oder, wenn Sie es vorziehen, "Variable") null sein. Es ist vielmehr der Wert, der durch Aufrufen erhalten wird Reference#get()
, der null sein kann. Wenn sich herausstellt, dass es null ist, sind Sie zu spät. Das referenzierte Objekt ist bereits auf dem Weg, gesammelt zu werden:
final String val = ref.get();
if (null != val)
{
}
else
{
}
WeakHashMap
aber keineSoftHashMap
oderPhantomHashMap
ausgezeichnete Frage, warum habe ich das vorher nicht bemerkt .. ??