Java boolean
memungkinkan nilai-nilai true
dan false
sementara Boolean memungkinkan true
, false
, dan null
. Saya sudah mulai mengonversi boolean
s ke Boolean
s. Ini dapat menyebabkan crash pada tes seperti
Boolean set = null;
...
if (set) ...
saat tes
if (set != null && set) ...
tampaknya dibuat-buat dan rawan kesalahan.
Kapan, jika pernah, apakah berguna untuk menggunakan Boolean
s dengan nilai nol? Jika tidak pernah, lalu apa keuntungan utama dari objek yang dibungkus?
PEMBARUAN: Ada begitu banyak jawaban yang berharga sehingga saya merangkumnya dalam jawaban saya sendiri. Saya paling tidak perantara di Jawa jadi saya telah mencoba menunjukkan hal-hal yang menurut saya berguna. Perhatikan bahwa pertanyaannya adalah "salah mengartikan" (Boolean tidak dapat "memiliki nilai nol") tetapi saya telah meninggalkannya seandainya orang lain memiliki kesalahpahaman yang sama
Boolean
variabel untuknull
membantu.null
apakah itu benar-benar digunakan sebagai kondisi ke-3.Boolean
adalah objek, sedangkan aboolean
adalah "skalar". JikaBoolean
referensi disetel ke nol, berarti objek yang bersangkutanBoolean
tidak ada. Anda tidak dapat menempatkan apa pun di dalam sesuatu yang tidak ada.Jawaban:
Gunakan
boolean
daripadaBoolean
setiap kali Anda bisa. Ini akan menghindari banyakNullPointerException
s dan membuat kode Anda lebih kuat.Boolean
berguna, misalnyaMessageFormat.format()
.sumber
Boolean isSchrodingerCatAlive = null;
(maaf, tidak bisa menahan;))Saya hampir tidak pernah menggunakan
Boolean
karena semantiknya tidak jelas dan tidak jelas. Pada dasarnya Anda memiliki logika 3-state: true, false atau tidak diketahui. Terkadang berguna untuk menggunakannya ketika misalnya Anda memberi pengguna pilihan antara dua nilai dan pengguna tidak menjawab sama sekali dan Anda benar-benar ingin mengetahui informasi itu (pikirkan: kolom database NULLable).Saya tidak melihat alasan untuk mengkonversi dari
boolean
keBoolean
seperti memperkenalkan overhead memori tambahan, NPE kemungkinan dan kurang mengetik. Biasanya saya menggunakan canggungBooleanUtils.isTrue()
untuk membuat hidup saya sedikit lebih mudahBoolean
.Satu-satunya alasan keberadaan
Boolean
adalah kemampuan untuk memiliki koleksiBoolean
jenis (generik tidak memungkinkanboolean
, serta semua primitif lainnya).sumber
Boolean.TRUE.equals(myBooleanObject)
atauBoolean.FALSE.equals(myBooleanObject)
.true
danfalse
.null
adalah tidak keadaan objek, melainkan keadaan referensi obyek.isTrue()
metode ..." yang terdengar seperti hal paling bodoh dalam sejarah fungsi utilitas. Namun, entah bagaimana, ini berguna ... itulah yang terbesar di sini.Wow, apa-apaan ini? Apakah hanya saya atau apakah semua jawaban ini salah atau paling tidak menyesatkan?
Kelas Boolean adalah pembungkus di sekitar tipe primitif boolean. Penggunaan pembungkus ini adalah untuk dapat melewati boolean dalam metode yang menerima objek atau generik. Yaitu vektor.
Objek Boolean TIDAK PERNAH memiliki nilai nol. Jika referensi Anda ke Boolean adalah nol, itu berarti bahwa Boolean Anda tidak pernah dibuat.
Anda mungkin menemukan ini berguna: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Boolean.java
Referensi Boolean nol seharusnya hanya digunakan untuk memicu logika yang sama dengan yang Anda punya referensi nol lainnya. Menggunakannya untuk logika tiga negara adalah kikuk.
EDIT: perhatikan, itu
Boolean a = true;
adalah pernyataan yang menyesatkan. Ini benar-benar sama dengan sesuatu yang lebih dekat denganBoolean a = new Boolean(true);
Silakan lihat autoboxing di sini: http://en.wikipedia.org/wiki/Boxing_%28computer_science%29#AutoboxingMungkin dari sinilah banyak kebingungan muncul.
EDIT2: Silakan baca komentar di bawah ini. Jika ada yang punya ide bagaimana merestrukturisasi jawaban saya untuk memasukkan ini, silakan lakukan.
sumber
Boolean a = true;
) dan kemudian mengatur ke null (a = null;
). Mungkin tidak elegan atau tidak, tetapi mungkin saja.Boolean a
; a adalah pointer ke objek Boolean. Jika Andaa = null;
Anda belum menetapkan Boolean Anda ke nol, Anda telah menetapkan referensi Anda ke nol. ApakahBoolean a = null; a.booleanValue();
Dalam kasus ini, Anda bahkan tidak pernah membuat objek Boolean dan karena itu akan melempar nullpointerexception. Beritahu saya jika Anda membutuhkan instruksi lebih lanjut.Boolean a = true;
, itu melakukan semacam sihir yang benar-benar ditafsirkan sebagaiBoolean a = new Boolean(true);
Thats mungkin tidak sepenuhnya benar karena alasan kinerja, tetapi Anda harus menyadari bahwa Boolean masih merupakan objek.Ada tiga alasan cepat:
true
,false
ataunull
xsd:boolean
nilai - nilai Skema XML yang dideklarasikan denganxsd:nillable="true"
List<Boolean>
- Anda tidak dapat menggunakanList<boolean>
sumber
boolean
" (styling gaya), karena di Oracle Anda biasanya menggunakanchar(1) null
dengan nilai 'T' dan 'F'. Jadi mungkin (dengan misalnya, adaptor tipe Hibernate) menjadi nol :)JAWABAN UNTUK PERTANYAAN SENDIRI: Saya pikir akan bermanfaat untuk menjawab pertanyaan saya sendiri karena saya telah belajar banyak dari jawabannya. Jawaban ini dimaksudkan untuk membantu mereka - seperti saya - yang tidak memiliki pemahaman lengkap tentang masalah ini. Jika saya menggunakan bahasa yang salah tolong perbaiki saya.
true
danfalse
. Ini adalah tidak adanya pointer ke objek. Karenanya berpikir bahwa Boolean bernilai 3 pada dasarnya salahSintaks untuk Boolean disingkat dan menyembunyikan fakta bahwa referensi menunjuk ke Objek:
Boolean a = true;
menyembunyikan fakta bahwa itu
true
adalah objek. Tugas setara lainnya mungkin:atau
Sintaks yang disingkat
if (a) ...
berbeda dari kebanyakan penugasan lainnya dan menyembunyikan fakta bahwa a dapat berupa referensi objek atau primitif. Jika suatu objek perlu diuji untuk
null
menghindari NPE. Bagi saya, secara psikologis lebih mudah untuk mengingat ini jika ada tes kesetaraan:if (a == true) ...
tempat kami mungkin diminta menguji nol. Jadi bentuk yang dipersingkat hanya aman saat
a
primitif.Bagi saya sendiri sekarang saya memiliki rekomendasi:
Boolean
dari suatu metode sebagaimana mestinyanull
. Hanya kembaliboolean
.Boolean
untuk membungkus elemen dalam wadah, atau argumen untuk metode di mana objek diperlukansumber
Kelas wrapper untuk primitif dapat digunakan di mana objek diperlukan, koleksi adalah sampel yang baik.
Bayangkan Anda perlu untuk beberapa toko alasan urutan
boolean
dalamArrayList
, ini dapat dilakukan dengan tinjuboolean
diBoolean
.Ada beberapa kata tentang ini di sini
Dari dokumentasi:
http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
sumber
Boolean
bungkus berguna ketika Anda ingin apakah nilai ditugaskan atau tidak terlepas daritrue
danfalse
. Ini memiliki tiga negara berikut:null
Sedangkan
boolean
hanya memiliki dua negara:Perbedaan di atas akan membantu dalam Daftar
Boolean
nilai, yang dapat dimilikiTrue
,False
atauNull
.sumber
Saya kira dalam beberapa kasus, Anda harus memiliki mekanisme untuk membedakan bidang Boolean yang sudah menetapkan nilai atau tidak.
sumber
Tujuan utama untuk Boolean adalah nilai nol. Nilai Null mengatakan, properti itu tidak terdefinisi , misalnya mengambil kolom database nullable.
Jika Anda benar-benar perlu mengonversi everyting dari primitif boolean ke wrapper Boolean, maka Anda dapat menggunakan yang berikut untuk mendukung kode lama:
sumber
Ada banyak kegunaan untuk nilai ** null ** di bungkus Boolean! :)
Misalnya, Anda mungkin memiliki formulir yang bernama "buletin" yang mengindikasikan apakah pengguna ingin atau tidak ingin buletin dari situs Anda. Jika pengguna tidak memilih nilai di bidang ini, Anda mungkin ingin menerapkan perilaku default untuk situasi itu (kirim? Jangan kirim ?, pertanyaan lagi?, Dll). Jelas, tidak disetel (atau tidak dipilih atau ** null **), tidak sama dengan benar atau salah.
Tetapi, jika "tidak disetel" tidak berlaku untuk model Anda, jangan ubah boolean primitive;)
sumber
Dalam definisi yang ketat dari elemen boolean, hanya ada dua nilai. Di dunia yang sempurna, itu benar. Di dunia nyata, elemen tersebut mungkin hilang atau tidak diketahui. Biasanya, ini melibatkan input pengguna. Dalam sistem berbasis layar, itu bisa dipaksa oleh suntingan. Dalam dunia batch menggunakan basis data atau input XML, elemen dapat dengan mudah hilang.
Jadi, di dunia non-sempurna yang kita tinggali, objek Boolean hebat karena dapat mewakili keadaan yang hilang atau tidak dikenal sebagai nol. Bagaimanapun, komputer hanya memodelkan dunia nyata dan harus memperhitungkan semua kemungkinan keadaan dan menanganinya dengan melempar pengecualian (kebanyakan karena ada kasus penggunaan di mana melempar pengecualian akan menjadi jawaban yang benar).
Dalam kasus saya, objek Boolean adalah jawaban yang sempurna karena input XML terkadang memiliki elemen yang hilang dan saya masih bisa mendapatkan nilai, menugaskannya ke Boolean dan kemudian memeriksa nol sebelum mencoba menggunakan tes benar atau salah dengan itu .
Hanya 2 sen saya.
sumber
Untuk semua jawaban yang baik di atas, saya hanya akan memberikan contoh konkret di
HttpSession
kelas servlet Java . Semoga contoh ini membantu menjelaskan beberapa pertanyaan yang mungkin masih Anda miliki.Jika Anda perlu menyimpan dan mengambil nilai untuk suatu sesi, Anda menggunakan metode
setAttribute
(String, Object), dangetAttribute
(String, Object). Jadi untuk nilai boolean, Anda terpaksa menggunakan kelas Boolean jika Anda ingin menyimpannya dalam sesi http.Baris terakhir akan menyebabkan a
NullPointerException
jika nilai atribut tidak disetel. (yang merupakan alasan membawaku ke pos ini). Jadi 3 keadaan logika di sini untuk tetap, apakah Anda lebih suka menggunakannya atau tidak.sumber
Cara terbaik adalah menghindari boolean sepenuhnya, karena setiap boolean menyiratkan bahwa Anda memiliki pernyataan bersyarat di tempat lain dalam kode Anda (lihat http://www.antiifcampaign.com/ dan pertanyaan ini: Dapatkah Anda menulis algoritma apa pun tanpa pernyataan if ? ).
Namun, secara pragmatis Anda harus menggunakan booleans dari waktu ke waktu, tetapi, seperti yang sudah Anda ketahui sendiri, berurusan dengan Booleans lebih rentan kesalahan dan lebih rumit. Jadi saya sarankan menggunakan boolean sedapat mungkin. Pengecualian dari ini mungkin merupakan database lama dengan kolom boolean yang dapat dibatalkan, meskipun saya akan mencoba menyembunyikannya dalam pemetaan saya juga.
sumber
Boolean bisa sangat membantu ketika Anda membutuhkan tiga negara. Seperti dalam pengujian perangkat lunak jika Uji lulus kirim benar, jika gagal kirim palsu dan jika uji kasus terganggu kirim nol yang akan menunjukkan uji kasus tidak dieksekusi.
sumber