nullと仲良く:Javaの空文字列チェックの書き方

こんにちは、さるまりんです。
Javaを書いていると、いつも気になるのがnullチェック。
文字列が空かどうかをチェックするとき、こんな書き方しませんか?
if ("".equals(str)) {
    // 空文字のときの処理
}
これはこれで安全なんですが、なんかもっといいのないかな?って思っていました。
今回はnullでも落ちないequalsについてスマートな方法はないかを考えてみました。

なぜstr.equals("")は危ないの?

if (str.equals("")) {
    ...
}
この書き方、strnullのときにNullPointerExceptionが発生してしまいます。悲しいです。
なのでよくこう書いています。
if ("".equals(str)) {
    ...
}
これは "".equals(...) の形なら、strnullでも問題ないという防御的コードです。
でも、なんか他にない?って思ってました。

Objects.equals(...)でスッキリ!

Java 7以降では、java.util.Objects.equals() を使って↓のように書くことができます。
import java.util.Objects;

if (Objects.equals(str, "")) {
    ...
}
この書き方なら:
  • strnullでもOK!(NullPointerException回避)
  • 読みやすくて自然
  • 引数の順番はどちらでもOK
nullかもしれないけど、ちゃんと比較したい!」そんなときに使えます。

外部ライブラリが使えるなら:StringUtils.isEmpty()

Apache Commons Langを使える環境なら、StringUtils.isEmpty()を使ってこんな感じに書けます。
import org.apache.commons.lang3.StringUtils;

if (StringUtils.isEmpty(str)) {
    ...
}
このisEmpty() は、
  • strnulltrue
  • str""true
  • どっちでもない → false
という挙動なので、「nullも空もまとめて“空”とみなしたい」ときに最適です。

どの書き方を選ぶべき?

目的別におすすめの書き方を考えてみました。
  • nullでも落ちずに比較したい → Objects.equals(str, "")
  • 空文字かだけを見たい(nullは来ない) → str.isEmpty()
  • nullも空も“空”とみなしたい → StringUtils.isEmpty(str)
nullチェック、equalsの書き方ひとつでコードが読みやすくもなり、安全にもなるんですね。
昔ながらの書き方ももちろんアリですが、新しい書き方を自分のものにしてうまく使うと、もっとすっきり書けるようです。
読んでくださってありがとうございます。
それではまた!