Kapan saya harus memilih kelas pembungkus atas tipe primitif? Atau Dalam keadaan apa saya harus memilih antara jenis pembungkus / Primitif?
java
wrapper
primitive-types
Gopi
sumber
sumber
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 mengirimnull
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.sumber
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.
sumber
Integer
lebih terbaca daripadaint
.Menurut pendapat saya, jika anggota kelas saya adalah variabel pembungkus, itu tidak bergantung pada nilai default, yang merupakan perilaku ramah pengembang.
1.
2.
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.
sumber
PersonBuilder
yang memunculkan pengecualian jika SSN tidak disetel sebelum memanggil "build" untuk mendapatkanPerson
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.
sumber
Praktis saya pernah mengalami situasi di mana penggunaan kelas pembungkus dapat dijelaskan.
Saya membuat kelas layanan yang memiliki
long
variabel tipelong
- saat tidak diinisialisasi, akan disetel ke 0 - ini akan membingungkan pengguna saat ditampilkan di GUILong
- saat tidak diinisialisasi, akan disetel kenull
- nilai null ini tidak akan muncul di GUI.Ini berlaku
Boolean
juga di mana nilai bisa lebih membingungkan ketika kita menggunakan primitifboolean
(karena nilai defaultnya salah).sumber
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.
sumber
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.
sumber
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.
sumber
Jika Anda ingin membuat tipe nilai. Sesuatu seperti ProductSKU atau AirportCode.
Ketika tipe primitif (string dalam contoh saya) mendefinisikan kesetaraan, Anda ingin mengganti kesetaraan.
sumber
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.
sumber