INI HARUS DIBATALKAN DENGAN JAVA 9!
Gunakan java.util.Cleaner
sebagai gantinya! (Atau sun.misc.Cleaner
di JRE lama)
Posting asli:
Saya menemukan bahwa penggunaan PhantomReferences memiliki jumlah jebakan yang hampir sama dengan metode finalizer (tetapi masalah yang lebih sedikit setelah Anda melakukannya dengan benar). Saya telah menulis solusi kecil (kerangka kerja yang sangat kecil untuk menggunakan PhantomReferences) untuk Java 8. Ini memungkinkan untuk menggunakan ekspresi lambda sebagai callback untuk dijalankan setelah objek telah dihapus. Anda dapat mendaftarkan callback untuk sumber daya dalam yang harus ditutup. Dengan ini saya telah menemukan solusi yang bekerja untuk saya karena membuatnya jauh lebih praktis.
https://github.com/claudemartin/java-cleanup
Berikut adalah contoh kecil untuk menunjukkan bagaimana panggilan balik didaftarkan:
class Foo implements Cleanup {
public Foo() {
this.registerCleanup((value) -> {
try {
value.close();
} catch (Exception e) {
logger.warning("closing resource failed", e);
}
}, this.resource);
}
Dan kemudian ada metode yang lebih sederhana untuk tutup otomatis, melakukan hal yang sama seperti di atas:
this.registerAutoClose(this.resource);
Untuk menjawab pertanyaan Anda:
[lalu apa gunanya]
Anda tidak dapat membersihkan sesuatu yang tidak ada. Tapi bisa saja sumber daya itu masih ada dan perlu dibersihkan agar bisa dihilangkan.
Tapi apa gunanya konsep / kelas ini?
Itu tidak harus melakukan apa pun dengan efek apa pun selain debugging / logging. Atau mungkin untuk statistik. Saya melihatnya lebih seperti layanan notifikasi dari GC. Anda juga dapat menggunakannya untuk menghapus data gabungan yang menjadi tidak relevan setelah objek dihapus (tetapi mungkin ada solusi yang lebih baik untuk itu). Contoh sering menyebutkan koneksi database untuk ditutup, tetapi saya tidak melihat bagaimana ini adalah ide yang bagus karena Anda tidak dapat bekerja dengan transaksi. Kerangka aplikasi akan memberikan solusi yang jauh lebih baik untuk itu.
Pernahkah Anda menggunakan ini di salah satu proyek Anda, atau apakah Anda punya contoh di mana kami harus menggunakan ini? Ataukah konsep ini dibuat hanya untuk sudut pandang wawancara;)
Saya menggunakannya sebagian besar hanya untuk logging. Jadi saya bisa melacak elemen yang dihapus dan melihat bagaimana GC bekerja dan bisa diubah. Saya tidak akan menjalankan kode penting dengan cara ini. Jika ada sesuatu yang perlu ditutup maka itu harus dilakukan dalam pernyataan coba-dengan-sumber daya. Dan saya menggunakannya dalam pengujian unit, untuk memastikan saya tidak memiliki kebocoran memori. Cara yang sama seperti jontejj melakukannya. Tetapi solusi saya sedikit lebih umum.