java.lang.ref.PhantomReference Clase en Java

Cuando creamos un objeto en Java, un objeto es fuerte por defecto. Para crear un objeto de referencia fantasma, debemos especificarlo explícitamente en la JVM. Los objetos de referencia fantasma se crean como objetos de referencia fantasma elegibles para la recolección de elementos no utilizados, pero no se recolectan instantáneamente. En su lugar, se inserta en una cola de referencia para que todas las referencias en cola se puedan borrar.

Los constructores de esta clase se muestran en la siguiente tabla

Parámetros del constructor Descripción del constructor
PhantomReference (T,ReferenceQueue <T> q) : Crea una nueva referencia fantasma que se refiere al objeto dado y se registra con la cola dada. Es posible crear una referencia fantasma con una cola nula, pero dicha referencia es completamente inútil: su método get siempre devolverá un valor nulo y, dado que no tiene una cola, nunca se pondrá en cola.

Los métodos heredados de la clase de referencia son los siguientes:

Nombre del método Descripción del método
obtener() Devuelve el referente de este objeto de referencia. Debido a que el referente de una referencia fantasma siempre es inaccesible, este método siempre devuelve un valor nulo.
clear() Borra este objeto de referencia. La invocación de este método no hará que este objeto se ponga en cola. 
enque() Agrega este objeto de referencia a la cola con la que está registrado, si corresponde.
está en cola() Indica si este objeto de referencia ha sido puesto en cola, ya sea por el programa o por el recolector de elementos no utilizados.

Ejemplo 1:

Java

// Java Program to illustrate PhantomReference class
// of java.lang.ref package
 
// Importing PhantomReference and ReferenceQueue classes
// from java.lanf.ref package
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
 
// Class 1
// Helper class
class HelperClass {
 
    // Method inside HelperClass
    void Display()
    {
        // Print statement whenever the function is called
        System.out.println("Display Function invoked ...");
    }
}
 
// Class 2
// Main class
public class GFG {
    // MyClass
    // Main driver method
    public static void main(String[] args)
    {
        // Creating a strong object of HelperClass
        HelperClass obj = new HelperClass();
 
        // Creating a reference queue of HelperClass type
        ReferenceQueue<HelperClass> rq
            = new ReferenceQueue<>();
 
        // Creating a phantom reference object using rq
        PhantomReference<HelperClass> pobj
            = new PhantomReference<>(obj, rq);
 
        // Display message only
        System.out.println(
            "-> Calling Display Function using strong object:");
 
        //  Calling the display method over the object of
        //  HelperClass
        obj.Display();
 
        // Display message for better readability
        System.out.println("-> Object set to null");
 
        obj = null;
 
        // Getting elements in PhantomReference object
        // using standard get() method
        obj = pobj.get();
 
        // Display status of  objects after fetching
        // PhantomReference class objects
        System.out.println(
            "-> Object status after fetching from PhantomReference now : "
            + obj);
 
        // Display message only
        System.out.println(
            "-> Calling Display Function after retrieving from weak Object");
 
        // Try block to check for exceptions
        try {
            obj.Display();
        }
 
        // Catch block to handle the exceptions
        catch (Exception E) {
 
            // Print message when an exception occurred
            System.out.println("-> Error : " + E);
        }
    }
}
Producción

-> Calling Display Function using strong object:
Display Function invoked ...
-> Object set to null
-> Object status after fetching from PhantomReference now : null
-> Calling Display Function after retrieving from weak Object
-> Error : java.lang.NullPointerException

Por lo tanto, se ve que, a diferencia de las referencias blandas y débiles, la referencia fantasma siempre devuelve un valor nulo.

Ejemplo 2:

Java

// Java Program to illustrate PhantomReference class
// of java.lang.ref package
 
// Importing Phantomreference and RefereenceQueue classes
// from java.lang.ref package
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
 
// Class 1
// HelperClass
class X {
 
    // Method
    // To print simply
    void show()
    {
 
        // Display message whenever
        // show() method is called
        System.out.println("show () from X invoked..");
    }
}
 
// Class 2
// Main class
public class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Creating default object of X class
        X obj = new X();
 
        // Creating new reference queue object
        ReferenceQueue<X> rq = new ReferenceQueue<X>();
 
        // Creating an object of PhantomReference class
        // of X class type with RefereneQueue object
        // reference queue
        PhantomReference<X> phantomobj
            = new PhantomReference<X>(obj, rq);
 
        // Display message
        System.out.println(
            "-> Trying to retrieve object from Phantom Reference :");
 
        // Try block to check for exceptions
        try {
 
            // this will always throw error as it has been
            // collected
            //  by the garbage collector
            phantomobj.get().show();
        }
 
        // Catch block to handle the exceptions
        catch (Exception e) {
 
            // Print and display the exception
            System.out.println(e);
        }
    }
}
Producción

-> Trying to retrieve object from Phantom Reference :
java.lang.NullPointerException

Publicación traducida automáticamente

Artículo escrito por varunkedia y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *