"Tekrar merhaba!"

"Şimdi size harika bir şeyden daha bahsedeceğim: WeakReference ."

"SoftReference ile neredeyse aynı görünüyor:"

Örnek
// Create a Cat object
Cat cat = new Cat();

// Create a weak reference to a Cat object
WeakReference<Cat> catRef = new WeakReference<Cat>(cat);

// Now only the catRef weak reference points at the object
cat = null;

// Now the ordinary cat variable also references the object
cat = catRef.get();

// Clear the weak reference
catRef.clear();

"Zayıf bir referansın başka bir özelliği daha vardır."

"Bir nesnenin sıradan referansları veya yumuşak referansları yoksa, ancak yalnızca zayıf referansları varsa, o zaman nesne canlıdır, ancak bir sonraki çöp toplama işleminde yok edilecektir."

"Bunu tekrar söyleyebilir misin? Bu referanslar arasındaki fark nedir?"

"Yalnızca bir SoftReference tarafından ölümden korunan bir nesne, istediğiniz kadar çöp koleksiyonundan kurtulabilir ve yetersiz bellek varsa muhtemelen yok edilecektir."

"Yalnızca bir WeakReference tarafından ölümden korunan bir nesne, bir sonraki çöp toplama işleminde hayatta kalamaz. Ancak bu gerçekleşene kadar, WeakReference'ta get() yöntemini çağırarak ve ardından yöntemlerini çağırarak veya onunla başka bir şey yaparak nesneyi alabilirsiniz. ."

"Ya nesneye hem SoftReference hem de WeakReference tarafından başvurulursa?"

"Bu çok basit. En az bir normal referans bir nesneye işaret ediyorsa, canlı kabul edilir. Bu arada, böyle bir referansa StrongReference denir."

"Bir nesneye normal referanslar işaret etmiyorsa, ancak bir SoftReference gösteriyorsa, o zaman ona yumuşak bir şekilde erişilebilir."

"Bir nesneye normal referanslar veya SoftReferences işaret etmiyorsa, ancak bir WeakReference gösteriyorsa, o zaman ona zayıf bir şekilde erişilebilir."

"Bir düşünün. SoftReference, nesneyi silinmekten korur ve nesnenin yalnızca yetersiz bellek olduğunda silinmesini sağlar. WeakReference, nesneyi bir sonraki çöp toplamaya kadar tutar. SoftReference, silinmeye karşı daha büyük direnç sunar."

"Ah. Sanırım anladım."

"Harika, o zaman sana WeakReferences ile ilgili başka bir ilginç şeyden, WeakHashMap'ten bahsedeceğim."

"Kulağa ciddi geliyor!"

"Ve sonra bazıları! Bir WeakHashMap, anahtarları zayıf referanslar (WeakReferences) olan bir HashMap'tir."

"Yani, böyle bir HashMap'e nesneler ekler ve onlarla çalışırsınız. İş her zamanki gibi."

"WeakHashMap'te sakladığınız nesnelerin anahtar olarak düzenli (güçlü veya yumuşak) referansları olduğu sürece, bu nesneler canlı olacaktır."

"Fakat uygulamanın tamamında bu nesnelere daha fazla referans olmadığını varsayalım. Onları ölmekten alıkoyan tek şey, WeakHashMap içindeki birkaç WeakReferences. Bir sonraki çöp toplama işleminden sonra, bu tür nesneler WeakHashMap'ten kaybolacak. hiç orada olmadılar."

"Anladığımdan emin değilim."

"Nesne çiftlerini bir WeakHashMap'te depolarsınız: bir anahtar ve bir değer. Ancak WeakHashMap, anahtarlara doğrudan değil, WeakReferences aracılığıyla başvurur. Bu nedenle, anahtar olarak kullanılan nesneler zayıf bir şekilde erişilebilir hale geldiğinde, bir sonraki adımda yok edilirler. çöp toplama. Ve sonuç olarak, değerleri de WeakHashMap'ten otomatik olarak kaldırılır."

"Belirli nesneler hakkında ek bilgileri depolamak için bir WeakHashMap kullanmak çok uygundur."

"Öncelikle nesnenin kendisini anahtar olarak kullanırsanız bilgiye ulaşmak çok kolay."

"İkincisi, nesne yok edilirse, ilgili tüm verilerle birlikte HashMap'ten kaybolur."

"Örneğin:

Örnek
// Create an object to store additional information about the user
WeakHashMap<User, StatisticInfo> userStatistics = new WeakHashMap<User, StatisticInfo>();

// Put information about the user into userStatistics
User user = session.getUser();
userStatistics.put(user, new StatisticInfo ());

// Get information about the user from userStatistics
User user = session.getUser();
StatisticInfo statistics = userStatistics.get(user);

// Remove any information about the user from userStatistics
User user = session.getUser();
userStatistics.remove(user);
  1. "Bir WeakHashMap içinde, anahtarlar WeakReferences olarak saklanır."
  2. "Kullanıcı nesnesi çöp toplayıcı tarafından yok edilir edilmez, WeakHashMap içinde remove(user) yöntemi dolaylı olarak çağrılır ve kullanıcı nesnesiyle ilişkili tüm bilgiler WeakHashMap'ten otomatik olarak kaldırılır."

"Bu güçlü bir araca benziyor. Onu nerede kullanabilirim?"

"Bu, koşullara bağlıdır. Diyelim ki, programda, nesneler tarafından temsil edilen bazı görevlerin çalışmasını izleyen ve onlar hakkında bilgileri bir günlüğe yazan bir ileti diziniz var. Bu ileti dizisi, izlenen nesneleri bir WeakHashMap'te depolayabilir. nesnelere ihtiyaç olmadığından, çöp toplayıcı onları siler ve bunlara yapılan referanslar da WeakHashMap'ten otomatik olarak kaldırılır."

"Kulağa ilginç geliyor. Henüz bu kadar güçlü mekanizmalardan yararlanan ciddi bir Java programı yazmamış gibi hissediyorum. Ama bunun için çalışacağım. Böylesine ilginç bir ders için çok teşekkürler Ellie."