Apakah ada situasi di mana akan lebih baik menggunakan referensi yang lemah daripada komposisi sederhana?

10

Meskipun dokumen Java menentukan, bahwa referensi Lemah terutama untuk pemetaan kanonik, Anda akan menemukan banyak , banyak , banyak orang di internet yang menyatakan, bahwa WeakHashMap sangat cocok untuk menyimpan metadata objek selama masa pakainya. Namun, tidak ada yang mengganggu untuk membuat contoh yang komprehensif DAN tepat .

Menggunakan WeakHashMap untuk menambahkan objek beberapa properti atau menyimpan suara metadata kepada saya, seperti keputusan sewenang-wenang berdasarkan kehendak untuk hanya menggunakan benda sialan itu. Dengan kata lain - desain yang buruk . Saya mengerti, bahwa ada situasi di mana warisan mungkin tidak tersedia (kelas akhir, antarmuka), tetapi bagaimana dengan komposisi? Saya tidak dapat memikirkan satu contoh di mana komposisi tidak akan menjadi pilihan. Dan tentu saja yang lebih baik, karena bergantung pada prinsip yang mapan, bukan "kekhasan bahasa".

Jadi, apakah ada situasi, di mana akan lebih baik menggunakan referensi yang lemah daripada komposisi sederhana? Jika tidak, mengapa semua orang di internet keliru?

Leprechaun
sumber
Kesalahan logika: "... keputusan sewenang-wenang berdasarkan keinginan untuk menggunakan benda sialan itu. Dengan kata lain - desain yang buruk." Tujuan mungkin tidak membenarkan cara, tetapi cara tidak cukup untuk menentang tujuan. Dengan metode yang sama, hasilnya secara hipotesis dapat menjadi desain yang baik. Meskipun untuk kasus ini saya tidak akan membantahnya. :)
cwharris
3
Referensi yang lemah adalah konsep ortogonal untuk komposisi dan pewarisan.
Robert Harvey

Jawaban:

13

Katakanlah saya perlu mengaitkan beberapa metadata dengan beberapa objek data. Ini adalah skenario yang cukup umum. Saya tidak mengontrol objek data, dan ada banyak dari mereka, dan API yang bersangkutan (panggilan balik, metode virtual, dll.) Menawarkan saya objek data tersebut, tetapi tanpa metadata saya. Jadi, saya perlu melacak beberapa status untuk masing-masing objek data tersebut, yaitu yang pernah saya lihat sebelumnya dan mungkin saya lihat lagi. Saya akan menyebut metadata ini sebagai perhiasan, yang merupakan istilah yang kadang-kadang digunakan untuk konsep itu.

Komposisi sederhana memberikan kemudahan pencarian dari objek penghias (satu dengan metadata) ke objek lain (satu dengan data), dengan anggapan bahwa karena saya mengontrol desain objek metadata, saya dapat menempatkan referensi langsung ke objek data .

Namun, kecuali Anda mengontrol desain objek data dan dapat mengubahnya, komposisi sederhana tidak memberikan pencarian terbalik (dari objek data ke beberapa metadata). Faktanya, kecuali jika Anda memiliki koleksi objek metadata, Anda bahkan tidak dapat menemukan item metadata terkait yang diberikan item objek (data).

Selain masalah pencarian arah dari objek untuk menemukan metadata yang menghiasi, ada juga masalah seumur hidup metadata.

Metadata yang terakumulasi dan tidak pernah dirilis bahkan ketika objek data tidak lagi digunakan adalah kebocoran memori.

Hashmap referensi lemah memecahkan kedua masalah. Itu memungkinkan menemukan metadata yang diberikan data, dan memungkinkan metadata dibebaskan pada suatu waktu setelah data dibebaskan.

Perhatikan lebih lanjut bahwa hashmap referensi lemah memungkinkan tidak hanya nilai (metadata) untuk direklamasi (gc'ed), tetapi juga kunci (data) untuk direklamasi (gc'ed), karena jika kunci disimpan, itu juga akan menjadi kebocoran memori, dan lebih jauh, nilai-nilai itu tidak akan pernah bisa dirilis.

Erik Eidt
sumber
Mengapa tidak menggunakan objek data dengan tabel metadata yang didukung hashmap yang didukung sebagai komposisi?
Jack
2
@ Jack, Komposisi, terutama "komposisi sederhana" dalam pikiran saya setidaknya, adalah objek yang merujuk ke objek lain, tetapi secara langsung demikian. Hubungan komposisi "has-a" diekspresikan menggunakan referensi sederhana, atau terkadang koleksi. Di sini hashmap adalah metode tidak langsung. Anda tidak dapat mencapai perhiasan jika Anda tidak memiliki hashmap. Sedangkan dalam komposisi Anda dapat melakukan navigasi ini. Jadi, saya lebih suka menyebut metadata ini sebagai perhiasan daripada komposisi, tetapi mereka tentu terkait. FWIW, perhiasan tidak (IMHO) menulis dengan data, hanya saja tidak sebaliknya.
Erik Eidt
@Jack, re: FWIW terakhir saya, saya baru menyadari bahwa ketika menggunakan hashmap yang lemah, Anda biasanya tidak akan meletakkan referensi dari metadata yang menghiasi objek ke yang lain karena memegang memori (atau jika Anda memang menginginkan has-a di dalamnya arah, itu harus menjadi referensi yang lemah). Jadi, biasanya klien hashmap yang lemah bekerja dengan dua hal yang secara efektif dipasangkan satu sama lain tetapi secara teknis tidak dalam komposisi objek satu sama lain.
Erik Eidt