Kapan saya harus memilih kelas pembungkus atas tipe primitif? Atau Dalam keadaan apa saya harus memilih antara jenis pembungkus / Primitif?
Jawaban:
Yang lain telah menyebutkan bahwa konstruksi tertentu seperti Collections
membutuhkan objek dan objek memiliki lebih banyak overhead daripada rekan primitifnya (memori & tinju).
Pertimbangan lainnya adalah:
Ini dapat berguna untuk menginisialisasi Objek ke null
atau mengirim null
parameter ke dalam metode / konstruktor untuk menunjukkan status atau fungsi. Ini tidak bisa dilakukan dengan primitif.
Banyak programmer menginisialisasi angka ke 0 (default) atau -1 untuk menandakan ini, tetapi tergantung pada skenarionya, ini mungkin salah atau menyesatkan.
Ini juga akan mengatur adegan NullPointerException
ketika ada sesuatu yang digunakan secara tidak benar, yang jauh lebih ramah programmer daripada beberapa bug sewenang-wenang di telepon.
Umumnya, Anda harus menggunakan tipe primitif kecuali Anda membutuhkan objek karena alasan tertentu (misalnya untuk dimasukkan ke dalam koleksi). Meski begitu, pertimbangkan pendekatan berbeda yang tidak memerlukan objek jika Anda ingin memaksimalkan kinerja numerik. Hal ini disarankan oleh dokumentasi , dan artikel ini menunjukkan bagaimana auto-boxing dapat menyebabkan perbedaan kinerja yang besar.
Integer
lebih terbaca daripada int
.
Menurut pendapat saya, jika anggota kelas saya adalah variabel pembungkus, itu tidak bergantung pada nilai default, yang merupakan perilaku ramah pengembang.
1.
class Person {
int SSN ; // gets initialized to zero by default
}
2.
class PersonBetter {
Integer SSN; //gets initialized to null by default
}
Dalam kasus pertama, Anda tidak dapat membiarkan nilai SSN tidak diinisialisasi. Ini mungkin menyakitkan jika Anda tidak memeriksa apakah nilai telah ditetapkan sebelum Anda mencoba menggunakannya.
Dalam kasus kedua, Anda dapat membiarkan SSN diinisialisasi dengan null. Yang dapat mengarah ke NullPointerException tetapi lebih baik daripada tanpa sadar memasukkan nilai default (nol) sebagai SSN ke database setiap kali Anda mencoba menggunakannya tanpa menginisialisasi bidang SSN.
PersonBuilder
yang memunculkan pengecualian jika SSN tidak disetel sebelum memanggil "build" untuk mendapatkan Person
instance. Saya pikir hal semacam ini berlebihan, tetapi itulah yang dipromosikan oleh bahasa Java untuk pola yang tepat.
Saya hanya akan menggunakan jenis pembungkus jika Anda harus.
Dalam menggunakannya Anda tidak mendapatkan banyak keuntungan, selain fakta bahwa mereka Objects
.
Dan, Anda kehilangan overhead dalam penggunaan memori dan waktu yang dihabiskan untuk tinju / unboxing.
Praktis saya pernah mengalami situasi di mana penggunaan kelas pembungkus dapat dijelaskan.
Saya membuat kelas layanan yang memiliki long
variabel tipe
long
- saat tidak diinisialisasi, akan disetel ke 0 - ini akan membingungkan pengguna saat ditampilkan di GUI Long
- saat tidak diinisialisasi, akan disetel ke null
- nilai null ini tidak akan muncul di GUI.Ini berlaku Boolean
juga di mana nilai bisa lebih membingungkan ketika kita menggunakan primitif boolean
(karena nilai defaultnya salah).
Koleksi adalah kasus umum untuk objek pembungkus Java sederhana. Namun, Anda mungkin mempertimbangkan untuk memberikan Wrapper arti yang lebih spesifik dalam kode (objek nilai).
IMHO hampir selalu ada manfaat untuk menggunakan objek nilai ketika itu bermuara pada keterbacaan dan pemeliharaan kode. Membungkus struktur data sederhana di dalam objek ketika mereka memiliki tanggung jawab tertentu seringkali menyederhanakan kode. Ini adalah sesuatu yang sangat penting dalam Desain Berdasarkan Domain .
Tentu saja ada masalah kinerja, tetapi saya cenderung mengabaikannya sampai saya memiliki kemungkinan untuk mengukur kinerja dengan data yang tepat dan melakukan tindakan yang lebih terarah ke area bermasalah. Mungkin juga lebih mudah untuk memahami masalah kinerja jika kodenya juga mudah dipahami.
kinerja aplikasi yang didominasi oleh kalkulasi numerik bisa mendapatkan keuntungan besar dari penggunaan primitif.
tipe primitif, seseorang menggunakan operator ==, tetapi untuk pembungkus pilihan yang lebih disukai adalah memanggil metode equals ().
"Jenis primitif dianggap berbahaya" karena mereka mencampur "semantik prosedural ke dalam model berorientasi objek yang seragam.
Banyak programmer menginisialisasi angka ke 0 (default) atau -1 untuk menandakan ini, tetapi tergantung pada skenarionya, ini mungkin salah atau menyesatkan.
Jika Anda ingin menggunakan Koleksi, Anda harus menggunakan kelas Wrapper.
Tipe primitif, digunakan untuk array. Juga, untuk merepresentasikan data yang tidak memiliki perilaku, misalnya, penghitung, atau kondisi boolean.
Sejak autoboxing, batas "kapan harus menggunakan primitif atau pembungkus" menjadi sangat kabur.
Tapi ingat, Wrappers adalah objek, jadi Anda mendapatkan semua fitur Java yang keren. Misalnya, Anda dapat menggunakan refleksi untuk membuat objek Integer, tetapi tidak untuk nilai int. Kelas pembungkus juga memiliki metode seperti valueOf.
Jika Anda ingin membuat tipe nilai. Sesuatu seperti ProductSKU atau AirportCode.
Ketika tipe primitif (string dalam contoh saya) mendefinisikan kesetaraan, Anda ingin mengganti kesetaraan.
Nilai primitif di Java bukanlah objek. Untuk memanipulasi nilai-nilai ini sebagai objek, paket java.lang menyediakan kelas pembungkus untuk setiap tipe data primitif.
Semua kelas Wrapper bersifat final. Objek dari semua kelas pembungkus yang dapat dimulai tidak dapat diubah yang berarti nilai dalam objek pembungkus tidak dapat diubah.
Meskipun, kelas void dianggap sebagai kelas pembungkus tetapi tidak menggabungkan nilai primitif dan tidak dapat dimulai. Itu tidak memiliki konstruktor publik, itu hanya menunjukkan objek kelas yang mewakili kata kunci void.