Saya melihat bahwa Java memiliki Boolean (kelas) vs boolean (primitif). Demikian juga, ada Integer (kelas) vs int (primitif). Apa praktik terbaik tentang kapan menggunakan versi primitif vs kelas? Haruskah saya pada dasarnya selalu menggunakan versi kelas kecuali saya memiliki alasan (kinerja?) Khusus untuk tidak? Apa cara yang paling umum dan diterima untuk menggunakan masing-masing?
54
Jawaban:
Dalam Item 5, dari Java Efektif, Joshua Bloch mengatakan
Salah satu penggunaan yang baik untuk kelas adalah ketika menggunakannya sebagai tipe generik (termasuk kelas Koleksi, seperti daftar dan peta) atau ketika Anda ingin mengubahnya ke tipe lain tanpa casting implisit (misalnya
Integer
kelas memiliki metodedoubleValue()
ataubyteValue()
.Sunting: Alasan Joshua Bloch adalah:
sumber
Praktik standar adalah untuk pergi dengan primitif, kecuali jika Anda berurusan dengan obat generik (pastikan Anda sadar akan autoboxing & unboxing !).
Ada sejumlah alasan bagus untuk mengikuti konvensi:
1. Anda menghindari kesalahan sederhana:
Ada beberapa kasus halus, non-intuitif yang sering menangkap pemula. Bahkan coders berpengalaman menyelinap dan membuat kesalahan ini kadang-kadang (mudah-mudahan ini akan diikuti dengan bersumpah ketika mereka men-debug kode dan menemukan kesalahan!).
Kesalahan yang paling umum adalah menggunakan
a == b
alih-aliha.equals(b)
. Orang-orang terbiasa melakukannyaa == b
dengan primitif sehingga mudah dilakukan ketika Anda menggunakan pembungkus Obyek.2. Keterbacaan:
Perhatikan dua contoh berikut. Kebanyakan orang akan mengatakan yang kedua lebih mudah dibaca.
3. Kinerja:
Faktanya adalah itu adalah lambat untuk menggunakan pembungkus Obyek untuk primitif daripada hanya menggunakan primitif. Anda menambahkan biaya instantiasi objek, panggilan metode, dll. Untuk hal-hal yang Anda gunakan di semua tempat .
Knuth's "... katakan sekitar 97% dari waktu: optimasi prematur adalah akar dari semua kejahatan" kutipan tidak benar-benar berlaku di sini Dia berbicara tentang optimisasi yang membuat kode (atau sistem) lebih rumit - jika Anda setuju dengan poin # 2, ini adalah optimasi yang membuat kode lebih rumit!
4. Ini konvensi:
Jika Anda membuat pilihan gaya yang berbeda hingga 99% dari programmer Java lain di luar sana, ada 2 kelemahan:
Biasanya saya akan membuat daftar poin tandingan, tapi jujur saya tidak bisa memikirkan alasan bagus untuk tidak mengikuti konvensi di sini!
sumber
==
. Objek harus dibandingkan denganequals()
.equals()
... Anda memberi mereka solusi sehingga membandingkan objek dengan==
menghasilkan hasil yang diharapkan.equals()
ke potongan kode kedua dan mengubah suara saya.Biasanya saya pergi dengan primitif. Namun, satu kekhasan menggunakan kelas seperti
Integer
danBoolean
adalah kemungkinan menugaskannull
ke variabel-variabel tersebut. Tentu saja, ini berarti Anda harus melakukannull
pemeriksaan setiap saat, tetapi masih lebih baik untuk mendapatkan NullPointerException daripada memiliki kesalahan logika karena menggunakan beberapaint
atauboolean
variabel yang belum diinisialisasi dengan benar.Tentu saja, karena Java 8 Anda dapat (dan mungkin harus) melangkah lebih jauh dan bukannya misalnya
Integer
Anda bisa menggunakanOptional<Integer>
untuk variabel yang mungkin atau mungkin tidak memiliki nilai.Selain itu, ia memperkenalkan kemungkinan untuk digunakan
null
untuk menetapkan variabel-variabel itu nilai " tidak dikenal " atau " wildcard ". Ini bisa berguna dalam beberapa situasi, misalnya, dalam Logika Ternary . Atau Anda mungkin ingin memeriksa apakah objek tertentu cocok dengan beberapa templat; dalam hal ini Anda bisa menggunakannull
variabel-variabel dalam templat yang dapat memiliki nilai apa pun di objek.sumber
null
sebagai default. Sebaliknya: Anda akan lebih baik tidak "menginisialisasi" variabel sama sekali. Menetapkan nilai default apa pun, bahkannull
, menutup kompiler ... tetapi juga membuatnya tidak mendeteksi kurangnya tugas yang berguna di sepanjang semua jalur kode. Dengan demikian, kesalahan yang bisa ditangkap oleh kompiler, lolos ke runtime.0.0
, atau-1
, atauInteger.MAX_VALUE
, atauFalse
, tetapi pada akhirnya Anda tidak tahu apakah itu nilai default, atau nilai aktual yang ditugaskan untuk variabel itu. Dalam kasus di mana ini penting, memilikinull
nilai mungkin lebih jelas.null
datang dengan sejumlah masalah, termasuk null paranoia.) Dalam suatu fungsi, variabel yang mungkin sebenarnya tidak diinisialisasi pada titik penggunaan biasanya menunjukkan kasus yang tidak tertutup. (Analisis penugasan pasti bersifat sederhana, jadi kemungkinan positif yang salah mungkin terjadi. Namun, Anda sering dapat menyelesaikannya dengan menyederhanakan logikanya.)Dalam kata-kata awam:
Anda menggunakan pembungkus saat Anda perlu menambahkan sesuatu ke koleksi.
Koleksi tidak dapat menampung primitif.
sumber
Fitur Java autoboxing seperti yang ditunjukkan oleh m3th0dman. Pikirkan di tingkat serendah mungkin dan Anda akan melihat bahwa autoboxing (masuk atau keluar) nilai primitif akan menyiratkan siklus jam yang dihabiskan dalam beberapa tugas yang tidak Anda butuhkan jika Anda bekerja dengan tipe data asli di sekitar aplikasi Anda.
Sebagai aturan umum, Anda harus mencoba menggunakan tipe data asli bila memungkinkan.
sumber