Saya diberi tautan ke dokumentasi oracle resmi: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
di mana dikatakan:
Nilai dasar
Tidak selalu perlu untuk menetapkan nilai saat bidang dideklarasikan. Kolom yang dideklarasikan tetapi tidak diinisialisasi akan ditetapkan ke default yang wajar oleh kompiler. Secara umum, standar ini akan menjadi nol atau nol, tergantung pada tipe data. Mengandalkan nilai-nilai default seperti itu, bagaimanapun, umumnya dianggap gaya pemrograman yang buruk.
Saya ingin menekankan bagian ini:
Mengandalkan nilai-nilai default seperti itu, bagaimanapun, umumnya dianggap gaya pemrograman yang buruk.
Tapi, oh boy, ini adalah, saya akan mengatakan, bagian mendasar dari spesifikasi bahasa mengetahui bahwa variabel instan memiliki nilai default. Mengapa ini adalah praktik pemrograman yang buruk jika banyak digunakan bahkan dalam kode sumber perpustakaan Java SE?
sumber
private int count = 0;
adalah kode yang tidak melakukan apa-apa, dan kode yang tidak melakukan apa-apa berantakan. Ini seperti mengimpor kelas dari java.lang, atau mendeklarasikan kelas denganextends Object
.public abstract
metode di antarmuka.private
metode dalam antarmuka tidak masuk akal, danabstract
tersirat.Jawaban:
Teks yang dikutip adalah:
Secara sinis: "secara umum dianggap bahwa" sering merupakan cara untuk mengatakan bahwa penulis belum mencoba menemukan sumber otoritatif untuk pernyataan yang disajikan.
Dalam hal ini pernyataannya jelas dipertanyakan. Bukti: 5 dari 5 Panduan Gaya Java yang disampling TIDAK mengatakan apa-apa tentang apakah Anda harus atau harus mengandalkan nilai default:
(Catatan, metodologi saya untuk pengambilan sampel adalah melihat 5 hit pencarian Google yang berbeda untuk "panduan gaya java". Kemudian saya mencari setiap dokumen untuk "default". Ini bukan analisis menyeluruh, tetapi berfungsi untuk menjelaskan maksud saya. )
BAIK. Jadi apakah itu benar-benar membantu keterbacaan kode Java?
Ini bisa diperdebatkan.
Di satu sisi, seorang programmer Java pemula yang belum belajar tentang inisialisasi default dapat bingung tentang dari mana nol atau nol berasal. Tetapi jika mereka bersusah payah untuk mencari inisialisasi eksplisit dan menemukan tidak ada, itu cukup untuk membuat mereka membaca tutorial atau buku untuk mencari tahu tentang inisialisasi default. (Kamu akan berharap!)
Di sisi lain, kami biasanya tidak mengharapkan programmer Java pemula untuk mempertahankan basis kode produksi. Untuk programmer Java yang berpengalaman, inisialisasi yang berlebihan tidak meningkatkan keterbacaan. Itu adalah kebisingan (paling-paling).
Menurut saya, satu-satunya hal yang dicapai dengan inisialisasi berlebihan pada suatu bidang adalah memberi sinyal kepada pembaca kode Anda di masa mendatang bahwa Anda telah memikirkan nilai awal. (Seperti yang diungkapkan @GhostCat, inisialisasi default tidak menunjukkan maksud.)
Tetapi sebaliknya jika saya adalah pembaca itu, saya tidak perlu mempercayai pemikiran penulis kode. Jadi nilai "sinyal" ini juga dipertanyakan.
Bagaimana dengan keandalan?
Di Jawa tidak ada bedanya. JLS menentukan bahwa inisialisasi default memang terjadi untuk bidang. Dan sebaliknya, untuk variabel lokal adalah kesalahan kompilasi untuk mencoba menggunakan variabel yang belum diinisialisasi dengan pasti.
Singkatnya, perilaku runtime dari variabel yang tidak diinisialisasi secara eksplisit sepenuhnya dapat diprediksi.
Dengan kontras dalam bahasa seperti C atau C ++ di mana variabel mungkin tidak diinisialisasi, perilaku tidak ditentukan , dan dapat menyebabkan crash, dan perbedaan perilaku pada platform yang berbeda. Kasus untuk selalu menginisialisasi variabel secara eksplisit jauh lebih kuat di sini.
Bagaimana dengan kinerja?
Seharusnya tidak ada bedanya. Kompiler JIT harus dapat memperlakukan inisialisasi yang berlebihan dan inisialisasi default sebagai sama.
sumber
Sederhana: mengandalkan nilai default tidak mengomunikasikan maksud.
Apakah Anda benar-benar ingin bidang itu dimulai dengan 0, atau Anda lupa memberikan nilai ?!
Dan tentu saja, referensi nol adalah setengah dari dua hal yang Anda perlukan untuk menjadi pengecualian nullpointer.
Akhirnya, menggunakan default menyiratkan bahwa Anda memiliki bidang non final. Yang Anda hindari jika memungkinkan.
Satu-satunya argumen yang bertentangan adalah: mengapa menuliskan hal-hal yang tidak harus Anda lakukan? Tapi saya pikir kerugian terompet yang terdaftar itu, sehingga menetapkan 0 ke bidang secara eksplisit lebih baik daripada menyerahkannya ke kompiler.
sumber
Idenya adalah jika Anda mengandalkan nilai default, maka tidak segera jelas bagi siapa pun yang membaca kode jika Anda sengaja membiarkannya sebagai nilai default, atau Anda hanya lupa untuk menetapkannya.
Kode sumber Java sebenarnya bukan sesuatu yang harus Anda andalkan sebagai contoh praktik pengkodean yang patut dicontoh. Ada banyak kasus di mana aturan seperti itu dilanggar (kadang-kadang sengaja untuk peningkatan kinerja kecil, dan kadang-kadang secara tidak sengaja atau karena gaya yang diterima telah berubah selama bertahun-tahun.)
sumber