"Halo, Amigo!"

"Hai, Riska!"

"Lha, piye dinamu?"

"Brilliant! Dina iki Bilaabo ngandhani babagan rekursi, lan Ellie ngandhani babagan referensi sing lemah lan alus."

"Apa dheweke ngandhani sampeyan babagan referensi phantom?"

"Apa sampeyan ngomong babagan PhantomReference? Dheweke nyebutake, nanging ora nerangake kanthi rinci."

"Apik, muga-muga sampeyan ora keberatan yen aku ngisi celah iki."

"Mesthi! Aku bakal ngrungokake sampeyan kanthi seneng, Rishi!"

"Apik. Banjur aku bakal miwiti."

"Referensi Phantom minangka referensi sing paling lemah ing kabeh. Dheweke mung duwe efek yen obyek ora duwe referensi apa wae kajaba referensi phantom."

PhantomReference - 1

"A PhantomReference digunakake ing prosedur pambusakan obyek Komplek.  Iki bisa uga perlu nalika obyek nindakake soko njaba mesin Java, contone, nelpon fungsi OS tingkat-rendah utawa nulis negara kanggo file utawa nindakake liyane penting banget."

"Iki conto carane sampeyan bisa nggunakake:"

Tuladha nggawe referensi phantom
// Special queue for phantom objects
ReferenceQueue<Integer> queue = new ReferenceQueue<Integer>();

// List of phantom references
ArrayList<PhantomReference<Integer>> list = new ArrayList<PhantomReference<Integer>>();

// Create 10 objects and add them to the list using phantom references
for ( int i = 0; i < 10; i++)
{
 Integer x = new Integer(i);
 list.add(new PhantomReference<Integer>(x, queue));
}

"Aku pengin tarik manungsa waé menyang baris pungkasan maneh. Ora mung obyek x liwati menyang PhantomReference - antrian khusus referensi phantom uga."

"Yagene kita kudu antri iki?"

"Iki sing arep dakkandhakake saiki."

"Yen sampeyan numpes obyek sing dicekel referensi phantom, iku bakal numpes, nanging ora dibusak saka memori! Apa sampeyan mikir babagan?!"

"Dadi, kepiye carane?"

"Ana sawetara nuansa ing kene, mula aku bakal miwiti kanthi sing paling gampang."

"Yen mung referensi phantom menyang obyek sing tetep, iki sing bakal kelakon:"

" Langkah 1. Sajrone pengumpulan sampah sabanjure, metode finalize () bakal diarani obyek. Nanging, yen metode finalize () durung ditindhes, langkah iki dilewati, lan langkah 2 langsung dieksekusi.

" Langkah 2. Sajrone koleksi sampah sabanjuré, obyek diselehake ing antrian khusus obyek phantom. Bakal dibusak saka antrian iki nalika cetha () cara disebut ing PhantomReference.

"Sapa sing nelpon? Obyek dibusak, ta?"

"Wah, obyek kasebut pancen mati ing jagad kita (jagad Jawa), nanging ora ilang. Iku tetep dadi phantom — antrian obyek phantom isih ana referensi . dikirim menyang konstruktor PhantomReference ."

"Dadi ReferenceQueue iki kaya akhirat?"

"Luwih kaya donya phantom."

"Lan obyek phantom mung bisa dibusak kanthi nelpon clear () ing referensi phantom sawijining."

"Iki carane nerusake conto sadurunge:"

Tuladha nggawe referensi phantom
// Special queue for phantom objects
ReferenceQueue<Integer> queue = new ReferenceQueue<Integer>();

// List of phantom references
ArrayList<PhantomReference<Integer>> list = new ArrayList<PhantomReference<Integer>>();

// Create 10 objects and add them to the list using phantom references
for ( int i = 0; i < 10; i++)
{
 Integer x = new Integer(i);
 list.add(new PhantomReference<Integer>(x, queue));
}

// Call the garbage collector and hope it will listen to us :)
// It should destroy all phantom reachable objects and put them in the queue
// of phantoms
System.gc();

// Get all objects from the queue
Reference<? extends Integer>referenceFromQueue;
while ((referenceFromQueue = queue.poll()) != null)
{
 // Display the object on the screen
 System.out.println(referenceFromQueue.get());

 // Clear the reference
 referenceFromQueue.clear();
}

"Aku ngerti yen ana kedadeyan ing kene. Aku meh ngerti persis apa sing kedadeyan."

"Nanging carane sampeyan nggunakake iki ing laku?"

"Iki conto sing luwih apik:"

Tuladha nggawe referensi phantom
// Special queue for phantom objects
ReferenceQueue<Integer> queue = new ReferenceQueue<Integer>();

// List of phantom references
ArrayList<PhantomInteger> list = new ArrayList<PhantomInteger>();

// Create 10 objects and add them to the list using phantom references
for ( int i = 0; i < 10; i++)
{
 Integer x = new Integer(i);
 list.add(new PhantomInteger (x, queue));
}
Utas iki bakal ngawasi antrian phantom lan mbusak obyek saka iku
Thread referenceThread = new Thread()
{
 public void run()
 {
  while (true)
  {
   try
   {
    // Get the new object from the queue. If there is no object, then we wait!
    PhantomInteger ref = (PhantomInteger)queue.remove();
    // Call the close method on it
    ref.close();
    ref.clear();
   }
   catch (Exception ex)
   {
    // Write errors to a log
   }
  }
 }
};
// Run the thread as a daemon
referenceThread.setDaemon(true);
referenceThread.start();
Iki kelas sing oleh warisan PhantomReference lan wis cedhak () cara
static class PhantomInteger extends PhantomReference<Integer>
{
 PhantomInteger(Integer referent, ReferenceQueue<? super Integer> queue)
 {
  super(referent, queue);
 }

 private void close()
 {
  System.out.println("Bad Integer totally destroyed!");
 }
}

"Kita nindakake telung perkara ing kene."

"Kaping pisanan, kita nggawe kelas PhantomInteger , sing dadi warisan PhantomReference <Integer> ."

"Kapindho, kelas iki duwe metode close () khusus . Kebutuhan kanggo nelpon metode iki sing miwiti kabeh.

"Kaping telu, kita ngumumake thread khusus: referenceThread . Iku ngenteni ing daur ulang nganti obyek liyane katon ing antrian phantom. Sanalika iki kedaden, thread mbusak obyek saka antrian phantom lan nelpon sawijining cedhak () cara. Cara sing cetha (). Lan kuwi. Phantom bisa pindhah menyang donya sing luwih apik. Ora bakal ngganggu kita maneh. "

"Sangat menarik, nanging kabeh bisa ditindakake."

"We are bener nelusuri antrian obyek mati, banjur kita bisa nelpon cara khusus kanggo saben wong."

"Nanging elinga, sampeyan ora bisa nelpon cara ing obyek dhewe.  Sampeyan ora bisa njaluk referensi kanggo iku! Cara PhantomReference njaluk () tansah bali null. "

"Nanging kita marisi PhantomReference!"

"Malah ing subclass PhantomReference, metode get () ngasilake null."

"Dadi aku mung nyimpen referensi kanggo obyek ing konstruktor"

"Ah. Nanging referensi kuwi bakal StrongReference, lan obyek ora bakal mungkasi munggah ing antrian phantom!"

"Dang. Oke, pasrah. Yen ora mungkin ya ora mungkin."

"Oke, apik. Muga-muga sampeyan bisa sinau babagan pelajaran dina iki."

"Ya, ana akeh materi anyar. Lan aku rumangsa wis ngerti kabeh. Matur nuwun kanggo pelajaran, Rishi."

"Sampeyan olèh. Wis, ayo santai. Nanging aja lali - kita duwe pelajaran liyane sore iki."