Senang Anda memposting ini sebagai pertanyaan. :)
Saya mencoba mengatakan bahwa destructor dan finally
secara konseptual berbeda:
- Destructors adalah untuk melepaskan sumber daya ( data )
finally
adalah untuk kembali ke penelepon ( kontrol )
Pertimbangkan, katakanlah, pseudo-code hipotetis ini:
try {
bar();
} finally {
logfile.print("bar has exited...");
}
finally
di sini adalah menyelesaikan masalah kontrol sepenuhnya dan bukan masalah manajemen sumber daya.
Tidak masuk akal untuk melakukan itu di destructor karena berbagai alasan:
- Tidak ada sesuatu yang "diperoleh" atau "diciptakan"
- Kegagalan untuk mencetak ke file log tidak akan menyebabkan kebocoran sumber daya, korupsi data, dll. (Dengan asumsi bahwa file log di sini tidak dimasukkan kembali ke dalam program di tempat lain)
- Adalah sah untuk
logfile.print
gagal, sedangkan kehancuran (secara konseptual) tidak bisa gagal
Berikut contoh lain, kali ini seperti di Javascript:
var mo_document = document, mo;
function observe(mutations) {
mo.disconnect(); // stop observing changes to prevent re-entrance
try {
/* modify stuff */
} finally {
mo.observe(mo_document); // continue observing (conceptually, this can fail)
}
}
mo = new MutationObserver(observe);
return observe();
Dalam contoh di atas, sekali lagi, tidak ada sumber daya yang akan dirilis.
Bahkan, finally
blok memperoleh sumber daya secara internal untuk mencapai tujuannya, yang berpotensi gagal. Oleh karena itu, tidak masuk akal untuk menggunakan destruktor (jika Javascript memilikinya).
Di sisi lain, dalam contoh ini:
b = get_data();
try {
a.write(b);
} finally {
free(b);
}
finally
sedang menghancurkan sumber daya b
,. Ini masalah data. Masalahnya bukan tentang mengembalikan kontrol ke pemanggil, tetapi tentang menghindari kebocoran sumber daya.
Kegagalan bukanlah suatu pilihan, dan seharusnya (secara konseptual) tidak pernah terjadi.
Setiap rilis b
harus dipasangkan dengan akuisisi, dan masuk akal untuk menggunakan RAII.
Dengan kata lain, hanya karena Anda dapat menggunakan salah satu untuk mensimulasikan baik itu tidak berarti keduanya adalah satu dan masalah yang sama atau bahwa keduanya adalah solusi yang tepat untuk kedua masalah.