Kami telah mulai menggunakan FindBugs dan menjelaskan parameter kami dengan @Nonnull
tepat, dan berfungsi baik untuk menunjukkan bug di awal siklus. Sejauh ini kami terus memeriksa argumen ini untuk null
menggunakan Guava checkNotNull
, tapi saya lebih suka untuk memeriksa null
hanya di tepi - tempat-tempat di mana nilainya dapat masuk tanpa diperiksa null
, misalnya, permintaan SOAP.
// service layer accessible from outside
public Person createPerson(@CheckForNull String name) {
return new Person(Preconditions.checkNotNull(name));
}
...
// internal constructor accessed only by the service layer
public Person(@Nonnull String name) {
this.name = Preconditions.checkNotNull(name); // remove this check?
}
Saya mengerti bahwa @Nonnull
itu tidak memblokir null
nilai-nilai itu sendiri.
Namun, mengingat bahwa FindBugs akan menunjukkan di mana saja nilai ditransfer dari bidang yang tidak ditandai ke yang ditandai @Nonnull
, tidak dapatkah kita bergantung padanya untuk menangkap kasus ini (yang memang terjadi) tanpa harus memeriksa nilai-nilai ini untuk di null
mana saja mereka diedarkan di sistem? Apakah saya naif ingin mempercayai alat ini dan menghindari cek verbose ini?
Intinya: Meskipun tampaknya aman untuk menghapus null
pemeriksaan kedua di bawah, apakah ini praktik yang buruk?
Pertanyaan ini mungkin terlalu mirip dengan Haruskah seseorang memeriksa nol jika dia tidak mengharapkan nol , tapi saya bertanya secara spesifik sehubungan dengan @Nonnull
anotasi.
@Nonnull
: sebagai spesifikasi kontrak. Saya telah menghapus cek defensif di belakang kontrak dan sejauh ini tidak mengalami kesulitan.Nah, pertimbangkan mengapa Anda tidak menulis
Pemrograman bukanlah ilmu hitam. Variabel tidak tiba-tiba menjadi Null. Jika Anda tahu variabel tidak Null, dan Anda tahu itu tidak berubah, maka jangan tidak memeriksa.
Jika Anda memeriksanya, beberapa programmer di masa depan (mungkin Anda) akan menghabiskan banyak waktu mencari tahu mengapa cek itu ada. Lagipula, cek itu pasti ada karena suatu alasan, jadi apa yang Anda abaikan?
sumber
@Nonnull
, ditetapkan kontrak yang penelepon tidak harus lulusnull
ke konstruktor, dan FindBugs menggunakan analisis statis untuk menemukan panggilan yang mungkin memungkinkannull
--specifically panggilan yang melewati nilai tidak ditandai@Nonnull
sendiri. Tetapi seorang penelepon bebas untuk menyampaikannull
dan mengabaikan peringatan dari FindBugs.