こんにちは、さるまりんです。
Javaを書いていると、いつも気になるのが
nullチェック。文字列が空かどうかをチェックするとき、こんな書き方しませんか?
if ("".equals(str)) {
// 空文字のときの処理
}
これはこれで安全なんですが、なんかもっといいのないかな?って思っていました。
今回は
nullでも落ちないequalsについてスマートな方法はないかを考えてみました。なぜstr.equals("")は危ないの?
if (str.equals("")) {
...
}
この書き方、
strがnullのときにNullPointerExceptionが発生してしまいます。悲しいです。なのでよくこう書いています。
if ("".equals(str)) {
...
}
これは
"".equals(...) の形なら、strがnullでも問題ないという防御的コードです。でも、なんか他にない?って思ってました。
Objects.equals(...)でスッキリ!
Java 7以降では、
java.util.Objects.equals() を使って↓のように書くことができます。import java.util.Objects;
if (Objects.equals(str, "")) {
...
}
この書き方なら:
strがnullでもOK!(NullPointerException回避)- 読みやすくて自然
- 引数の順番はどちらでもOK
「
nullかもしれないけど、ちゃんと比較したい!」そんなときに使えます。外部ライブラリが使えるなら:StringUtils.isEmpty()
Apache Commons Langを使える環境なら、
StringUtils.isEmpty()を使ってこんな感じに書けます。import org.apache.commons.lang3.StringUtils;
if (StringUtils.isEmpty(str)) {
...
}
この
isEmpty() は、strがnull→truestrが""→true- どっちでもない →
false
という挙動なので、「
nullも空もまとめて“空”とみなしたい」ときに最適です。どの書き方を選ぶべき?
目的別におすすめの書き方を考えてみました。
nullでも落ちずに比較したい →Objects.equals(str, "")- 空文字かだけを見たい(
nullは来ない) →str.isEmpty() nullも空も“空”とみなしたい →StringUtils.isEmpty(str)
nullチェック、equalsの書き方ひとつでコードが読みやすくもなり、安全にもなるんですね。昔ながらの書き方ももちろんアリですが、新しい書き方を自分のものにしてうまく使うと、もっとすっきり書けるようです。
読んでくださってありがとうございます。
それではまた!