Pertanyaan Tetapkan referensi objek ke null atau panggil metode finalisasi ()?


Sebagai pemula java saya ingin bertanya tentang apakah saya harus menetapkan referensi objek ke null, atau memanggil metode finalisasi dalam proyek besar?

Sebagai contoh,

while( obj... some code here){
 //code stuff
}
obj = null; // or obj.finalize();

Sejak saya selesai dengan obj  dan tidak ada referensi lagi untuk itu apa yang harus saya lakukan dengannya? atur ke null atau hubungi finalize () ;?

aku membaca java doc tapi paragraf ini The finalize method is never invoked more than once by a Java virtual machine for any given object. membingungkan saya. Apakah itu berarti bahwa bahkan jika saya menggunakannya, itu tidak akan melakukan apa-apa kecuali GC memutuskan untuk melakukannya? Kemudian, akankah keputusan saya untuk mengatur obj untuk membantu null?

Ini semua dengan asumsi proyek yang besar dan ruang lingkupnya belum berakhir agar GC untuk membatalkan alokasi itu sendiri. Terima kasih.


5
2018-01-07 17:08


asal


Jawaban:


TAK PERNAH aktifkan objek finalize() metode secara manual. Ini untuk penggunaan VM saja. VM akan memohonnya pada waktu yang tepat (sebagai bagian dari proses pengumpulan sampah).

Anda dapat menetapkan variabel referensi ke null mungkin membuat objek memenuhi syarat untuk pengumpulan sampah lebih cepat daripada yang seharusnya, tetapi hal itu tidak menyebabkannya menjadi GC akan segera. (Perhatikan bahwa Anda menggunakan = operator untuk tugas; == adalah operator relasional untuk pengujian kesetaraan operandnya.)

Jika objek Anda menyatakan bahwa Anda harus memastikan dibersihkan sesuai permintaan, maka terapkan metode yang berbeda untuk itu. close() adalah nama populer untuk metode semacam itu. Ini adalah praktik yang baik untuk menghindari penerapan finalize() jika keadaan memungkinkan. GC secara otomatis akan mengurus sebagian besar sumber daya yang mungkin Anda pikir Anda ingin bersihkan secara manual finalize().


1
2018-01-07 17:16



Bukan keduanya. Jika obj tidak lagi digunakan lebih lanjut dalam kode (dan tidak ada yang lain referensi objek yang sama seperti obj tidak), objek tidak akan lagi dapat dijangkau dan akan menjadi kandidat untuk Pengumpulan Sampah.

Pengaturan obj untuk null tidak akan mencapai apa pun (YMMV tergantung pada implementasi pemulung).

Seperti untuk menelepon finalize()tidak. Biarkan Pengumpul Sampah yang mengurus itu. Tapi perhatikan itu finalize adalah metode seperti yang lain. Apa teks yang Anda kutip katakan adalah bahwa GC tidak akan menyebutnya lebih dari satu kali, terlepas dari berapa kali kode Anda memintanya.


7
2018-01-07 17:11