Apa cara terbaik untuk melindungi dari null dalam for for loop di Jawa?
Ini sepertinya jelek:
if (someList != null) {
for (Object object : someList) {
// do whatever
}
}
Atau
if (someList == null) {
return; // Or throw ex
}
for (Object object : someList) {
// do whatever
}
Mungkin tidak ada cara lain. Haruskah mereka memasukkannya ke dalam for
konstruk itu sendiri, jika itu nol maka jangan menjalankan loop?
null
tidak sama dengan koleksi kosong.Jawaban:
Anda sebaiknya memverifikasi dari mana Anda mendapatkan daftar itu.
Yang Anda butuhkan hanyalah daftar kosong, karena daftar kosong tidak akan gagal.
Jika Anda mendapatkan daftar ini dari tempat lain dan tidak tahu apakah itu ok atau tidak, Anda dapat membuat metode utilitas dan menggunakannya seperti ini:
Dan tentu saja
safe
:sumber
emptyList
java.sun.com/j2se/1.5.0/docs/api/java/util/... Apa IIRC?Anda berpotensi menulis metode pembantu yang mengembalikan urutan kosong jika Anda memasukkan nol:
Kemudian gunakan:
Saya tidak berpikir saya akan benar-benar melakukannya - saya biasanya menggunakan formulir kedua Anda. Secara khusus, "atau melempar mantan" adalah penting - jika benar-benar tidak boleh nol, Anda harus melempar pengecualian. Anda tahu bahwa ada sesuatu yang salah, tetapi Anda tidak tahu sejauh mana kerusakannya. Batalkan lebih awal.
sumber
emptyIfNull
adalahIterable<T>
- adaremove
metode yang disayangkanIterator<T>
, tapi itu satu-satunya aspek yang bisa berubah-ubah (dan jika Anda punya koleksi kosong, mengapa Anda mencoba menghapus sesuatu darinya?) Tidak jelas apa yang Anda lakukan kembali ke sini.Ini sudah 2017, dan sekarang Anda dapat menggunakan Apache Commons Collections4
Penggunaan:
Anda dapat melakukan pemeriksaan nol-aman yang sama dengan kelas Koleksi lainnya
CollectionUtils.emptyIfNull
.sumber
Collections.emptyList()
internal, yang pada gilirannya selalu mengembalikan daftar kosong yang sama yang tidak dapat dimodifikasi yang sama yang dialokasikan sebelumnya.Dengan Java 8
Optional
:sumber
someList != null ? someList : Collections.emptyList()
dan juga menciptakan dan segera membuang instanceOptional
objek.Gunakan
ArrayUtils.nullToEmpty
daricommons-lang
perpustakaan untuk ArrayFungsi ini ada di
commons-lang
perpustakaan, yang termasuk dalam sebagian besar proyek Java.Ini sama dengan jawaban yang diberikan oleh @OscarRyz, tetapi demi mantra KERING , saya percaya ini patut diperhatikan. Lihat halaman proyek commons-lang . Berikut adalah dokumentasi dan sumber
nullToEmpty
APIEntri Maven untuk dimasukkan
commons-lang
dalam proyek Anda jika belum.Sayangnya,
commons-lang
tidak menyediakan fungsionalitas ini untukList
tipe. Dalam hal ini Anda harus menggunakan metode pembantu seperti yang disebutkan sebelumnya.sumber
Jika Anda mendapatkannya
List
dari pemanggilan metode yang Anda terapkan, maka jangan kembalinull
, kembalikan yang kosongList
.Jika Anda tidak dapat mengubah implementasi maka Anda mandek dengan
null
cek. Jika tidaknull
, maka lemparkan pengecualian.Saya tidak akan menggunakan metode helper yang mengembalikan daftar kosong karena mungkin berguna beberapa kali tetapi kemudian Anda akan terbiasa menyebutnya di setiap loop yang Anda buat mungkin menyembunyikan beberapa bug.
sumber
Saya telah memodifikasi jawaban di atas, jadi Anda tidak perlu membuang dari Object
dan kemudian cukup panggil Daftar dengan
Penjelasan: MyOwnObject: Jika
List<Integer>
kemudian MyOwnObject akan menjadi Integer dalam hal ini.sumber
Cara lain untuk melindungi secara efektif terhadap null dalam perulangan for adalah dengan membungkus koleksi Anda dengan Google Guava
Optional<T>
karena ini, satu harapan, membuat kemungkinan koleksi kosong secara efektif menjadi jelas karena klien diharapkan untuk memeriksa apakah koleksi tersebut hadirOptional.isPresent()
.sumber
Bagi siapa pun yang tidak tertarik dalam menulis metode keselamatan nol statis mereka sendiri, Anda dapat menggunakan: commons-lang's
org.apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object)
. Sebagai contoh:ObjectUtils.defaultIfNull JavaDoc
sumber
Gunakan,
CollectionUtils.isEmpty(Collection coll)
metode yang aman untuk memeriksa apakah kumpulan yang ditentukan kosong.untuk ini
import org.apache.commons.collections.CollectionUtils
.Ketergantungan maven
sumber
sumber