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