注意!!
初心者向け + 個人的な意見多めな記事です。
動作環境
- java 1.8.0_191
背景
コードレビューをしていて、たまに目にするのが、
List<String> list = (Listがreturnされる)何かしらの処理/メソッド;
// NULLおよび空チェック
if (list == null || list.size() == 0) {
}
というListのNULL/空チェックを行っているコードです。
動作的には問題ありません。
しかし、あまり気に入らないので修正してもらうことがあります。
理由としては主に2つあります。
1つ目:ListがNULLになることがあるの?
まず、「何かしらの処理/メソッド」でlist変数をNULLにすることがあるのか確認してほしいです。
NULLにすることがあるのならば、そこの処理を修正したほうがいいです。
なぜ?
NullPointerExceptionとなる可能性を減らすためです。
また、呼び出し元のNULLチェックをなくすことができます。
もし、「何かしら処理/メソッド」が共通化しているなら、全ての呼び出し元でNULLチェックしなければなりません。
呼び出し元でNULLチェックしていなければ、NullPointerExceptionになるリスクが出てきます。
NULLを返すことがなかったら、メソッド呼び出し元はNULLが返ってくるケースを想定する必要がなくなります。
呼び出し元の実装が、すこ~~~し楽になります。
list内の要素をremove()
やremoveAll()
などを使って全削除するとか、
Collections.emptyList()
などで、空リストを返すようにしましょう。
また、List宣言にfinalをつけることも得策です。
※ コメントにて教えていただきました。
2つ目:size == 0ではなく、isEmpty()を使ってほしい
これは個人的な趣味?意見?です。
list.size == 0
ではなく、list.isEmpty()
としてほしいです。
なぜ?
「isEmpty()
の中身はsize == 0
じゃないか!!!」という意見もあると思います。
全くその通りです。
処理内容としては何も変わりません。
でも list.size == 0
より list.isEmpty()
のほうが分かりやすくないですか…?
たぶん list.isEmpty()
のほうが、Javaプログラマじゃない人が見ても、「空かどうか確認してるんだな!」って分かりやすいのではないかと思います。
個人的な結論
NULLチェックは止めて、isEmpty()
の空チェックのみにしてほしいです。
NULLチェックが不要になるように、「何かしらの処理/メソッド」でNULLを絶対に返さないように、空リストは返してもNULLは絶対に返さないこと。
size() == 0
より、isEmpty()
のほうが可読性が高いと個人的に思うので、isEmpty()
を使用すること。
List<String> list = (Listがreturnされる)何かしらの処理/メソッド;
// 空チェックのみ
if (list.isEmpty()) {
}
「NULLチェックしてるつもり」コードに出会うこともある
たまに、下のように &&
で判定しているコードがありますが、NULLがきたらNullPointerExceptionになるので注意しましょう。
if(list == null && list.size() == 0){}
おまけ
どうやら新入社員研修で、(list == null || list.size() == 0)と教わったらしいです。
間違ってないけど………とモヤモヤしたので記事にしました。(どいうことだ