package ar.com.javacuriosities.references;
import ar.com.javacuriosities.references.util.Foo;
import java.lang.ref.WeakReference;
/*
* Las WeakReference no cuentan como una referencia Strong por lo cual
* el GC puede liberar la memoria cuando no hay ninguna referencia Strong.
* El método get() devuelve NULL luego de que no haya mas referencias del tipo Strong,
* aunque este método devuelva NULL esto no quiere decir que se haya limpiado de la
* memoria porque aun falta ejecutar el método finalize, el cual podría revivir la instancia.
*
* Las WeakReference no deben ser usadas para manejos de Cache ya que son liberadas antes que las SoftReference
*/
public class Step2WeakReferences {
public static void main(String[] args) {
// Creamos una referencia a un objeto Foo del tipo Strong Reference
Foo foo = new Foo();
System.out.println("Instance: " + foo);
/*
* Creamos un Weak Reference al objeto, esto funciona como un envoltorio
* sobre la referencia
*/
WeakReference<Foo> weakReference = new WeakReference<Foo>(foo);
// Hacemos al objeto elegible por el GC (La referencia interna del Weak no se tiene en cuenta)
foo = null;
// Obtenemos un Strong reference, ahora no es elegible por el GC
Foo strongReference = weakReference.get();
System.out.println("Instance: " + strongReference);
// Volvemos a hacerla elegible por el GC
strongReference = null;
// Sugerimos al GC correr
System.gc();
// Esto deberla ser NULL si el GC fue ejecutado
System.out.println("Instance: " + weakReference.get());
}
}