"Halo lagi!"

"Sekarang saya akan memberi tahu Anda tentang satu hal lagi yang luar biasa: WeakReference ."

"Tampaknya hampir sama dengan SoftReference:"

Contoh
// 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();

"Referensi yang lemah memiliki fitur khusus lainnya."

"Jika suatu objek tidak memiliki referensi biasa atau referensi lunak, tetapi hanya referensi yang lemah, maka objek tersebut hidup, tetapi akan dihancurkan pada pengumpulan sampah berikutnya."

"Bisakah kamu mengatakan itu lagi? Apa perbedaan antara referensi ini?"

"Sebuah objek yang dijaga dari kematian hanya dengan SoftReference dapat bertahan dari pengumpulan sampah sebanyak yang Anda suka dan mungkin akan dihancurkan jika memori tidak mencukupi."

"Sebuah objek yang dijaga dari kematian hanya dengan WeakReference tidak akan selamat dari pengumpulan sampah berikutnya. Tapi sampai itu terjadi, Anda bisa mendapatkan objek dengan memanggil metode get() pada WeakReference dan kemudian memanggil metodenya atau melakukan sesuatu yang lain dengannya ."

"Bagaimana jika objek direferensikan oleh SoftReference dan WeakReference?"

"Itu sederhana. Jika setidaknya satu referensi reguler menunjuk ke suatu objek, itu dianggap hidup. Omong-omong, referensi semacam itu disebut StrongReference."

"Jika tidak ada referensi reguler yang menunjuk ke suatu objek, tetapi SoftReference melakukannya, maka itu dapat dijangkau dengan lembut."

"Jika tidak ada referensi reguler atau SoftReferences yang menunjuk ke suatu objek, tetapi WeakReference melakukannya, maka objek tersebut dapat dijangkau dengan lemah."

"Pikirkan tentang hal ini. SoftReference melindungi objek dari penghapusan dan memastikan bahwa objek akan dihapus hanya jika memori tidak mencukupi. WeakReference menahan objek hingga pengumpulan sampah berikutnya. SoftReference menawarkan resistensi yang lebih besar terhadap penghapusan."

"Ah. Sepertinya aku mengerti."

"Bagus, kalau begitu saya akan memberi tahu Anda tentang hal menarik lainnya yang melibatkan WeakReferences - WeakHashMap."

"Kedengarannya serius!"

"Dan kemudian beberapa! A WeakHashMap adalah HashMap yang kuncinya adalah referensi lemah (WeakReferences)."

"Artinya, Anda menambahkan objek ke HashMap tersebut dan bekerja dengannya. Bisnis seperti biasa."

"Selama objek yang Anda simpan di WeakHashMap memiliki referensi reguler (kuat atau lunak) sebagai kunci, objek ini akan hidup."

"Tapi misalkan tidak ada lagi referensi ke objek-objek ini di seluruh aplikasi. Yang membuat mereka tidak mati adalah beberapa WeakHashMap di dalam WeakHashMap. Setelah pengumpulan sampah berikutnya, objek seperti itu akan hilang dari WeakHashMap. Dengan sendirinya. Seolah-olah mereka tidak pernah ada."

"Aku tidak yakin aku mengerti."

"Anda menyimpan pasangan objek di WeakHashMap: kunci dan nilai. Tetapi WeakHashMap tidak mereferensikan kunci secara langsung, melainkan melalui WeakReferences. Oleh karena itu, saat objek yang digunakan sebagai kunci menjadi tidak dapat dijangkau dengan lemah, objek tersebut akan dihancurkan pada saat berikutnya pengumpulan sampah. Dan akibatnya, nilainya juga dihapus secara otomatis dari WeakHashMap."

"Sangat nyaman menggunakan WeakHashMap untuk menyimpan informasi tambahan tentang objek tertentu."

"Pertama-tama, sangat mudah mengakses informasi jika Anda menggunakan objek itu sendiri sebagai kuncinya."

"Kedua, jika objek dihancurkan, objek tersebut akan menghilang dari HashMap bersama dengan semua data terkait."

"Misalnya:

Contoh
// 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. "Di dalam WeakHashMap, kunci disimpan sebagai WeakReferences."
  2. "Segera setelah objek pengguna dihancurkan oleh pengumpul sampah, metode hapus(pengguna) secara implisit dipanggil di dalam WeakHashMap dan informasi apa pun yang terkait dengan objek pengguna dihapus dari WeakHashMap secara otomatis."

"Ini terlihat seperti alat yang ampuh. Di mana saya bisa menggunakannya?"

"Itu tergantung pada keadaan. Katakanlah Anda memiliki utas dalam program yang melacak pekerjaan beberapa tugas, diwakili oleh objek, dan menulis informasi tentangnya ke log. Utas ini dapat menyimpan objek yang dipantau di WeakHashMap. Segera karena objek tidak diperlukan, pengumpul sampah menghapusnya, dan referensi ke objek tersebut juga dihapus secara otomatis dari WeakHashMap."

"Kedengarannya menarik. Saya sudah merasa belum pernah menulis program Java yang serius yang memanfaatkan mekanisme yang begitu kuat. Tapi saya akan mengusahakannya. Terima kasih banyak, Ellie, untuk pelajaran yang begitu menarik."