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

public class EmpatReferensi {
    public static void main(String[] args) {
        StringBuilder dataLemah = new StringBuilder("pesan-lemah");
        StringBuilder dataLunak = new StringBuilder("pesan-lunak");
        StringBuilder dataHantu = new StringBuilder("pesan-hantu");

        WeakReference<StringBuilder> lemah = new WeakReference<>(dataLemah);
        SoftReference<StringBuilder> lunak = new SoftReference<>(dataLunak);
        ReferenceQueue<StringBuilder> antrean = new ReferenceQueue<>();
        PhantomReference<StringBuilder> hantu = new PhantomReference<>(dataHantu, antrean);

        System.out.println("saat masih reachable:");
        System.out.println("  lemah.get() = " + lemah.get());
        System.out.println("  lunak.get() = " + lunak.get());
        System.out.println("  hantu.get() = " + hantu.get());

        dataLemah = null;
        dataLunak = null;
        dataHantu = null;
        System.gc();

        System.out.println("setelah strong reference dilepas + System.gc():");
        System.out.println("  lemah.get() = " + lemah.get());
        System.out.println("  lunak.get() = " + lunak.get());
        System.out.println("  hantu masuk antrean? " + (antrean.poll() != null));
    }
}
