Phantom reference je označení odkazu v jazyce Java, která je vytvořena pomocí třídy java.lang.ref.PhantomReference a dovoluje zabalit objekt, na který ukazuje. Na rozdíl od normálmí silné (strong) reference dovoluje, aby objekt, na který ukazuje referent mohl být, uvolněn garbage collectorem a poté smazán z paměti. Phantom reference je vhodná ke sledovnání odkazovaného objektu, jestli se stal nedostupný a neoživitelný, k provedení různých operací jako jsou nahrátí dalších velkých souborů, aby nedošlo k chybě OutOfMemoryError nebo k provedení závěrečných operací po životě objektu (uvolňování neuvolněných zdrojů) mnohem efektivněji a lépe než je tomu u funkce finalize(). Třída java.ref.PhantomReference je rozšíření jeho předka java.ref.Reference a tak z ní dědí i funkci get(), která by měla vrátit odkaz na odkazovaný objekt PhantomReference (referenta), ale jelikož je tento objekt už nedostupný a neoživitelný vrací null. Phantom reference je tedy použitelná jen s Reference Queue (Odkazovací frontou). Díky této frontě poznáme, že se referent dostal do Phantom dostupného stavu (není oživitelný a je určen k smazání z paměti), tím že bude do této fronty přidána pomocí garbage collectoru na referenta odkazující Phantom reference. K Phantom referenci je možné přiřadit vždy jen jeden odkaz a vždy jen jednu frontu a to vždy při jeho vytvoření přidáním odkazů na referenta a na frontu do jeho konstruktoru. Phantom reference se automaticky nečistí. Třída java.lang.ref.PhantomReference není finální, takže jí lze libovolně rozšiřovat.

Příklad použití Následují příklad ukazuje použití s Phantom referencí.

package javaWiki;

import java.lang.ref.PhantomReference; import java.lang.ref.ReferenceQueue;

public class PhantomRef {

public static void main(String[] args) { Object o = new Object(); ReferenceQueue<PhantomReference<Object>> q = new ReferenceQueue<PhantomReference<Object>>();

PhantomReference pRef = new PhantomReference(o,q);

o.hashCode(); // používání objektu o = null; // ztráta reference

// čekání až garbage collector přidá pRef do fronty

while(true){ System.gc(); System.runFinalization(); PhantomReference pRef2 = null; try { // blokovací operace remove(), čeká až garbage collector // přidá objekt pRef do fronty pRef2 = (PhantomReference) q.remove(200); } catch (IllegalArgumentException | InterruptedException e) { e.printStackTrace();

if (pRef2 != null){ System.out.println("Object o byl přidán do fronty " + "a je připraven ke smazání z paměti."); pRef.clear(); break; } else { System.out.println("nepovedlo se");

Známe také jiné druhy referencí z balíku java.lang.ref než je Phantom reference a to Soft reference a Weak reference, každá určená k jiné práci.

Externí odkazy https://web.archive.org/web/20110312083304/http://download.oracle.com/javase/1.4.2/docs/api/java/lang/ref/PhantomReference.html http://www.kdgregory.com/index.php?page=java.refobj

Kategorie:Java Kategorie:Datové typy