Secara umum, ya, referensi yang lemah harus digunakan. Tapi pertama-tama kita harus jelas tentang apa yang Anda maksud dengan "pendengar acara".
Telepon balik
Dalam beberapa gaya pemrograman, terutama dalam konteks operasi asinkron, biasanya merupakan bagian dari perhitungan sebagai panggilan balik yang dijalankan pada peristiwa tertentu. Misalnya a Promise
[ 1 ] mungkin memiliki then
metode yang mendaftarkan panggilan balik setelah menyelesaikan langkah sebelumnya:
promise =
Promise.new(async_task) # - kick off a task
.then(value => operation_on(value)) # - queue other operations
.then(value => other_operation(value)) # that get executed on completion
... # do other stuff in the meanwhile
# later:
result = promise.value # block for the result
Di sini, callback yang terdaftar then
harus dipegang oleh referensi yang kuat, karena janji (sumber acara) adalah satu-satunya objek yang memegang referensi ke callback. Ini bukan masalah karena janji itu sendiri memiliki masa hidup yang terbatas, dan akan menjadi sampah yang dikumpulkan setelah rantai janji selesai.
Pola Pengamat
Dalam pola pengamat, subjek memiliki daftar pengamat dependen. Ketika subjek memasuki beberapa keadaan, pengamat diberitahu sesuai dengan beberapa antarmuka. Pengamat dapat ditambahkan dan dihapus dari subjek. Pengamat ini tidak ada dalam kekosongan semantik, tetapi sedang menunggu acara untuk beberapa tujuan.
Jika tujuan ini tidak ada lagi, pengamat harus dihapus dari subjek. Bahkan dalam bahasa yang dikumpulkan sampah, penghapusan ini mungkin harus dilakukan secara manual. Jika kita gagal menghapus pengamat, itu akan tetap hidup melalui referensi dari subjek ke pengamat, dan dengan itu semua objek yang dirujuk oleh pengamat. Ini membuang-buang memori dan menurunkan kinerja sebagai pengamat (sekarang tidak berguna) masih akan diberitahu.
Referensi yang lemah memperbaiki kebocoran memori ini, karena memungkinkan pengamat mengumpulkan sampah. Ketika subjek berkeliling untuk memberi tahu semua pengamat dan menemukan bahwa salah satu referensi lemah ke pengamat kosong, referensi itu dapat dihapus dengan aman. Sebagai alternatif, referensi yang lemah dapat diimplementasikan dengan cara yang memungkinkan subjek untuk mendaftarkan panggilan pembersihan yang akan menghapus pengamat setelah pengumpulan.
Tetapi perhatikan bahwa referensi yang lemah hanyalah bantuan pita yang membatasi kerusakan dengan lupa untuk memindahkan pengamat. Solusi yang tepat adalah memastikan bahwa seorang pengamat dihapus ketika tidak lagi diperlukan. Opsi meliputi:
Melakukannya secara manual, tapi itu rawan kesalahan.
Menggunakan sesuatu yang mirip dengan coba-dengan-sumber daya di Jawa atau using
di C #.
Kehancuran deterministik, seperti melalui idiom RAII. Perhatikan bahwa dalam bahasa dengan pengumpulan sampah deterministik, ini mungkin masih membutuhkan referensi yang lemah dari subjek ke pengamat untuk memicu destruktor.