Saya cukup tua. Aku pernah ke sana dan melihatnya dan membenturkan kepalaku berkali-kali.
Saya berada di sebuah konferensi di Hursley Park di mana anak-anak IBM memberi tahu kami betapa indahnya bahasa Jawa yang baru ini, hanya ada yang bertanya ... mengapa tidak ada penghancur benda-benda ini. Dia tidak bermaksud hal yang kita tahu sebagai destruktor di C ++, tetapi tidak ada finalis juga (atau ada finalis tetapi mereka pada dasarnya tidak bekerja). Ini jauh di belakang, dan kami memutuskan bahwa Jawa sedikit bahasa mainan pada saat itu.
sekarang mereka menambahkan Finalisers ke spec bahasa dan Java melihat beberapa adopsi.
Tentu saja, nanti semua orang diberitahu untuk tidak menempatkan finalis pada objek mereka karena itu memperlambat GC. (karena harus tidak hanya mengunci tumpukan tetapi memindahkan objek yang akan diselesaikan ke area temp, karena metode ini tidak dapat dipanggil karena GC telah menghentikan aplikasi agar tidak berjalan. Sebaliknya mereka akan dipanggil segera sebelum yang berikutnya Siklus GC) (dan lebih buruk lagi, terkadang finaliser tidak akan pernah dipanggil sama sekali ketika aplikasi dimatikan. Bayangkan tidak ada file handle Anda yang ditutup, selamanya)
Kemudian kami memiliki C #, dan saya ingat forum diskusi di MSDN di mana kami diberitahu betapa indahnya bahasa C # baru ini. Seseorang bertanya mengapa tidak ada finalisasi deterministik dan anak-anak MS mengatakan kepada kami bagaimana kami tidak membutuhkan hal-hal seperti itu, kemudian mengatakan kepada kami bahwa kami perlu mengubah cara kami merancang aplikasi, kemudian memberi tahu kami betapa menakjubkannya GC dan bagaimana semua aplikasi lama kami sampah dan tidak pernah berhasil karena semua referensi melingkar. Kemudian mereka menyerah pada tekanan dan memberi tahu kami bahwa mereka telah menambahkan pola IDispose ini ke spek yang bisa kita gunakan. Saya pikir itu cukup banyak kembali ke manajemen memori manual untuk kami di aplikasi C # pada saat itu.
Tentu saja, anak-anak MS kemudian menemukan bahwa semua yang mereka katakan kepada kami adalah ... well, mereka membuat IDispose sedikit lebih dari sekadar antarmuka standar, dan kemudian menambahkan pernyataan menggunakan. W00t! Mereka menyadari bahwa finalisasi deterministik adalah sesuatu yang hilang dari bahasa. Tentu saja, Anda masih harus ingat untuk meletakkannya di mana-mana, jadi ini masih sedikit manual, tetapi lebih baik.
Jadi mengapa mereka melakukannya ketika mereka bisa menggunakan semantik gaya yang secara otomatis ditempatkan pada setiap blok lingkup sejak awal? Mungkin efisiensi, tetapi saya suka berpikir bahwa mereka tidak menyadarinya. Sama seperti akhirnya mereka menyadari bahwa Anda masih memerlukan pointer pintar di .NET (google SafeHandle) mereka berpikir bahwa GC benar-benar akan menyelesaikan semua masalah. Mereka lupa bahwa suatu objek lebih dari sekadar memori dan bahwa GC terutama dirancang untuk menangani manajemen memori. mereka terjebak dalam gagasan bahwa GC akan menangani ini, dan lupa bahwa Anda meletakkan barang-barang lain di sana, sebuah objek bukan hanya gumpalan memori yang tidak masalah jika Anda tidak menghapusnya untuk sementara waktu.
Tetapi saya juga berpikir bahwa kurangnya metode penyelesaian dalam Java asli memiliki sedikit lebih banyak - bahwa objek yang Anda buat adalah semua tentang memori, dan jika Anda ingin menghapus sesuatu yang lain (seperti pegangan DB atau soket atau apa pun ) maka Anda diharapkan melakukannya secara manual .
Ingat Java dirancang untuk lingkungan tertanam di mana orang terbiasa menulis kode C dengan banyak alokasi manual, jadi tidak memiliki bebas otomatis tidak banyak masalah - mereka tidak pernah melakukannya sebelumnya, jadi mengapa Anda membutuhkannya di Jawa? Masalahnya tidak ada hubungannya dengan utas, atau tumpukan / tumpukan, itu mungkin hanya ada untuk membuat alokasi memori (dan karenanya de-alokasi) sedikit lebih mudah. Secara keseluruhan, pernyataan try / akhirnya mungkin merupakan tempat yang lebih baik untuk menangani sumber daya non-memori.
Jadi IMHO, cara. NET hanya menyalin kelemahan terbesar Jawa adalah kelemahan terbesarnya. .NET seharusnya merupakan C ++ yang lebih baik, bukan Java yang lebih baik.