Pada Java 1.5, Anda dapat cukup banyak interchange Integer
dengan int
dalam banyak situasi.
Namun, saya menemukan cacat potensial dalam kode saya yang sedikit mengejutkan saya.
Kode berikut:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
tampaknya salah mengatur ketidakcocokan ketika nilainya sama, meskipun saya tidak bisa menentukan dalam keadaan apa. Saya menetapkan breakpoint di Eclipse dan melihat bahwa Integer
nilai keduanya 137, dan saya memeriksa ekspresi boolean dan mengatakan itu salah, tetapi ketika saya melangkahinya, itu membuat ketidakcocokan menjadi kenyataan.
Mengubah persyaratan ke:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
memperbaiki masalah.
Adakah yang bisa menjelaskan mengapa ini terjadi? Sejauh ini, saya hanya melihat perilaku di localhost saya di PC saya sendiri. Dalam kasus khusus ini, kode berhasil melewati sekitar 20 perbandingan, tetapi gagal pada 2. Masalahnya secara konsisten dapat direproduksi.
Jika itu adalah masalah yang lazim, itu harus menyebabkan kesalahan pada lingkungan kami yang lain (dev dan pengujian), tetapi sejauh ini, tidak ada yang melaporkan masalah setelah ratusan tes yang mengeksekusi cuplikan kode ini.
Apakah masih tidak sah untuk digunakan ==
untuk membandingkan dua Integer
nilai?
Selain semua jawaban bagus di bawah ini, tautan stackoverflow berikut memiliki sedikit informasi tambahan. Itu sebenarnya akan menjawab pertanyaan awal saya, tetapi karena saya tidak menyebutkan autoboxing dalam pertanyaan saya, itu tidak muncul dalam saran yang dipilih:
Mengapa kompiler / JVM tidak bisa membuat autoboxing “hanya berfungsi”?