Saya telah melihat objek yang dibuat dalam kode Java tanpa menyimpan referensi ke objek. Misalnya, dalam plugin gerhana saya telah melihat Shell SWT dibuat seperti:
new Shell();
Objek Shell baru ini tidak disimpan dalam variabel, tetapi akan tetap direferensikan sampai jendela dibuang yang [saya percaya?] Terjadi secara default ketika jendela ditutup.
Apakah praktik yang buruk untuk membuat objek seperti ini tanpa menyimpan referensi kepada mereka? Atau perpustakaan itu dirancang dengan buruk? Bagaimana jika saya tidak memerlukan referensi, tetapi hanya menginginkan "efek samping" dari objek? Haruskah saya menyimpan referensi?
MEMPERBARUI:
Diakui, contoh saya di atas buruk. Walaupun saya telah melihat elemen UI dibuat seperti ini, membuat SWT Shell seperti ini mungkin tidak ada gunanya karena Anda perlu memanggil metode terbuka pada instance Shell. Ada contoh yang lebih baik yang disediakan oleh aix seperti berikut dari tutorial concurrency Java :
(new HelloThread()).start();
Praktek ini terlihat dalam banyak konteks, jadi pertanyaannya tetap. Apakah ini praktik yang baik?
Shell.createTopLevelShell()
atau apa pun, vs menggunakan konstruktor dalam kasus ini. Tetapi secara fungsional ada sedikit perbedaan.)dispose()
d: Aturan 1: Jika Anda membuatnya, Anda membuangnya. eclipse.org/articles/swt-design-2/swt-design-2.htmlJawaban:
Ada elemen preferensi pribadi untuk ini, tapi saya pikir tidak menyimpan referensi tidak selalu merupakan praktik yang buruk.
Pertimbangkan contoh hipotetis berikut:
Jika objek prosesor baru perlu dibuat untuk setiap file, dan tidak diperlukan setelah
process()
panggilan, tidak ada gunanya menyimpan referensi untuk itu.Berikut adalah contoh lain, diambil dari tutorial concurrency Java :
Saya telah melihat banyak contoh lain ketika referensi tidak disimpan, dan itu terbaca dengan baik di mata saya, seperti:
(
StringBuilder
Objek tidak disimpan.)Ada pola serupa yang melibatkan common.lang's
HashCodeBuilder
et al.sumber
getInstance()
merupakan pabrik dan bukan singleton).process
.Jika Anda tidak memerlukan referensi ke objek yang dibuat, maka jangan pegang referensi. Sesederhana itu.
sumber
Secara umum, praktik yang baik untuk merilis referensi secepat mungkin dapat dirilis. Saya tidak melihat perbedaan antara:
dan
Sejauh menyangkut kode, Anda hanya menghindari penggunaan nama variabel, yang bisa menjadi hal yang positif. Kompiler JIT pada umumnya cukup pintar untuk mengenalinya bahwa sampah dapat mengumpulkan utas setelah penggunaan terakhirnya, jadi mungkin tidak ada perbedaan dari sudut pandang kinerja.
Satu-satunya masalah nyata yang harus dihindari adalah Kode dalam Constructor Anti-Pattern , tetapi tidak terdengar seperti itu yang Anda tanyakan.
sumber
Ini bisa buruk jika Anda menggunakan SWT, karena di sana Anda harus membersihkan diri sendiri (memanggil metode buang ()). Tetapi untuk kelas lain (non SWT) tidak apa-apa.
Inilah artikel tentang Mengelola Sumber Daya Sistem Operasi
sumber
Pertama-tama, Anda akan mengganggu orang yang belajar C atau C ++ sebelum Java. Saya akan meninggalkan itu sebagai latihan bagi pembaca untuk memutuskan apakah itu pro atau kontra.
Walaupun ada beberapa situasi di mana objek dirancang untuk berumur pendek, sebagian besar waktu jika sesuatu cukup kompleks untuk membuat objek, cukup kompleks untuk memiliki alasan yang baik untuk menyimpan referensi, jadi tidak menyimpannya harus di paling tidak menjadi peringatan untuk mengecek apakah Anda melewatkan sesuatu.
Misalnya, dalam tutorial tidak ada yang peduli tentang menjaga referensi utas, tetapi dalam kehidupan nyata, jika sesuatu membutuhkan waktu cukup lama sehingga Anda ingin menelurkan utas, biasanya butuh waktu yang cukup lama sehingga Anda ingin dapat membatalkan utas. Atau jika berumur pendek, Anda biasanya akan memunculkan banyak utas yang Anda inginkan
join
sebelum melanjutkan. Atau Anda ingin memastikan kreasi thread Anda benar-benar berhasil. Atau Anda ingin memastikan utas selesai dengan bersih sebelum keluar. Anda mendapatkan fotonya.sumber