"Merhaba, Amigo!"

"Merhaba Rişi!"

"Peki, günün nasıl geçti?"

"Harika! Bugün Bilaabo bana özyinelemeden bahsetti ve Ellie bana zayıf ve yumuşak referanslardan bahsetti."

"Sana hayalet referanslardan bahsetti mi?"

"PhantomReference'tan mı bahsediyorsun? Bundan bahsetmişti ama ayrıntılı olarak açıklamadı."

"Harika, o zaman umarım bu boşluğu doldurmamın bir sakıncası yoktur."

"Elbette! Seni zevkle dinleyeceğim, Rishi!"

"Harika. O zaman başlayacağım."

"Hayalet referanslar, en zayıf referanslardır. Yalnızca bir nesnenin hayalet referanslar dışında herhangi bir referansı yoksa etkili olurlar."

PhantomReferans - 1

"Bir PhantomReference, karmaşık bir nesne silme prosedüründe kullanılır.  Bu, bir nesne Java makinesinin dışında bir şey yaptığında, örneğin düşük seviye işletim sistemi işlevlerini çağırdığında veya durumunu bir dosyaya yazdığında veya çok önemli başka bir şey yaptığında gerekli olabilir."

"Nasıl kullanabileceğine dair bir örnek:"

Hayali referanslar oluşturma örneği
// 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));
}

"Tekrar son satıra dikkat çekmek istiyorum. x nesnesi PhantomReference'a iletilmekle kalmaz , aynı zamanda özel bir hayali referans kuyruğu da vardır."

"Bu kuyruğa neden ihtiyacımız var?"

"Şimdi sana söyleyeceğim şey bu."

"Hayalet bir referans tarafından tutulan bir nesneyi yok ettiğinizde, yok olur ama bellekten silinmez! Bu konuda ne düşünüyorsunuz?!"

"Peki, bu nasıl çalışıyor?"

"Burada pek çok nüans var, bu yüzden en basitinden başlayacağım."

"Bir nesneye yalnızca hayali referanslar kalırsa, o zaman nesneye olan şey şu olacaktır:"

" 1. Adım . Bir sonraki çöp toplama işlemi sırasında, nesne üzerinde finalize() yöntemi çağrılacaktır. Ancak, finalize() yöntemi geçersiz kılınmamışsa, bu adım atlanır ve 2. adım hemen yürütülür."

" 2. Adım . Bir sonraki çöp toplama sırasında, nesne özel bir hayalet nesneler kuyruğuna yerleştirilir. PhantomReference'ta clear() yöntemi çağrıldığında bu sıradan silinecektir."

"Kim diyor? Nesne silindi, değil mi?"

"Eh, nesne gerçekten de bizim dünyamızda (Java dünyası) öldü, ama ortadan kaybolmadı. Bir hayalet olarak kalıyor - hayalet nesneler sırası hâlâ ona bir gönderme yapıyor. Referansını çok dikkatli bir şekilde kullandığımız aynı ReferenceQueue PhantomReference yapıcısına iletildi ."

"Yani bu ReferenceQueue öbür dünya gibi mi?"

"Daha çok hayalet bir dünya gibi."

"Ve bir hayali nesne, yalnızca hayali referansında clear() çağrılarak silinebilir."

"Önceki örneğe nasıl devam edeceğiniz aşağıda açıklanmıştır:"

Hayali referanslar oluşturma örneği
// 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();
}

"Burada bir şeyler döndüğünü anlıyorum. Hatta neredeyse tam olarak ne olduğunu anlıyorum."

"Ama bunu pratikte nasıl kullanıyorsun?"

"İşte daha iyi bir örnek:"

Hayali referanslar oluşturma örneği
// 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));
}
Bu iş parçacığı hayalet kuyruğu izleyecek ve ondan nesneleri kaldıracak
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();
Bu, PhantomReference'ı miras alan ve bir close() yöntemine sahip bir sınıftır.
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!");
 }
}

"Burada üç şey yaptık."

"İlk olarak, PhantomReference < Integer > mirasını alan PhantomInteger sınıfını oluşturduk ."

"İkincisi, bu sınıfın özel bir close () yöntemi var. Tüm bunları başlatan, bu yöntemi çağırma ihtiyacıydı.

"Üçüncü olarak, özel bir iş parçacığı ilan ettik: referenceThread . Fantom kuyruğunda başka bir nesne görünene kadar bir döngüde bekler. Bu olur olmaz, iş parçacığı nesneyi fantom kuyruğundan kaldırır ve close () yöntemini çağırır. Ve sonra clear() yöntemi. İşte bu kadar. Hayalet daha iyi bir dünyaya gidebilir. Artık bizim dünyamızda bizi rahatsız etmeyecek."

"Çok ilginç, ama her şey yolunda gitti."

"Aslında ölmekte olan bir nesne kuyruğunu izliyoruz ve sonra her biri için özel bir yöntem arayabiliriz."

"Ama unutmayın, yöntemi nesnenin kendisinde çağıramazsınız.  Ona bir başvuru alamazsınız! PhantomReference'ın get() yöntemi her zaman null değerini döndürür. "

"Ama PhantomReference'ı devraldık!"

"PhantomReference'ın bir alt sınıfı içinde bile, get() yöntemi null değerini döndürür."

"Bu yüzden yapıcıdaki nesneye bir referans kaydediyorum"

"Ah. Ama böyle bir referans StrongReference olur ve nesne asla fantom kuyruğa girmez!"

"Dang. Tamam, vazgeç. İmkansızsa, o zaman imkansızdır."

"Tamam, güzel. Umarım bugünkü dersten değerli bir şey öğrenmişsindir."

"Evet, çok fazla yeni malzeme vardı. Ve zaten her şeyi bildiğimi sanıyordum. Ders için teşekkürler, Rishi."

"Rica ederim. Bu kadar, git rahatla. Ama unutma - bu akşam bir dersimiz daha var."