以下のような空文字チェック、nullチェックのソースをよく見かける。
//よく見かける空チェック
if(str == null || str.equals("")){
System.out.println(str);
}
ソース量が増えると『チェックに抜けはないか?』や『NullPointerExceptionが発生しないか?』などの確認も面倒くさい。
ユーティリティクラスに共通メソッドを作るのもいいが、ユーティリティクラスという名のもとに、よくわからないstaticメソッドの集合体になりがち。できれば、1つでも管理するメソッドを減らしたい気分になる。
JakartaのCommonsを使って、ユーティリティクラスのわかりにくいstaticメソッド管理を減らしていこう
文字列のチェック
文字列の空チェック、nullチェック
StringUtils.isEmptyでnull、空文字のチェックができる。スペースだとfalseになるので注意。
import org.apache.commons.lang3.StringUtils;
public class StringUtilsIsEmptyTest {
public static void main(String[] args) {
//nullの場合
System.out.println("StringUtils.isEmpty(null) = " + StringUtils.isEmpty(null));
//空文字の場合
System.out.println("StringUtils.isEmpty(\"\") = " + StringUtils.isEmpty(""));
//半角スペースの場合
System.out.println("StringUtils.isEmpty(\" \") = " + StringUtils.isEmpty(" "));
}
}
実行結果
StringUtils.isEmpty(null) = true StringUtils.isEmpty("") = true StringUtils.isEmpty(" ") = false
文字列の半角・全角スペースを含めてチェック
入力パラメータをチェックする場合、スペースだけ入力される場合もありうる。
そんな場合は、StringUtils.isBlankメソッドを使う。
import org.apache.commons.lang3.StringUtils;
public class StringUtilsIsBlankTest {
public static void main(String[] args) {
//nullの場合
System.out.println("StringUtils.isBlank(null) = " + StringUtils.isBlank(null));
//空文字の場合
System.out.println("StringUtils.isBlank(\"\") = " + StringUtils.isBlank(""));
//半角スペースの場合
System.out.println("StringUtils.isBlank(\" \") = " + StringUtils.isBlank(" "));
//全角スペースの場合
System.out.println("StringUtils.isBlank(\" \") = " + StringUtils.isBlank(" "));
}
}
実行結果
StringUtils.isBlank(null) = true StringUtils.isBlank("") = true StringUtils.isBlank(" ") = true StringUtils.isBlank(" ") = true
nullの置換
nullなら空文字への置換も1行でできる。第二引数で置換文字を指定することもできる。
import org.apache.commons.lang3.StringUtils;
public class StringUtilsDefaultTest {
public static void main(String[] args) {
//nullじゃないから置換しない
System.out.println("StringUtils.defaultString(\"abc\") = " + StringUtils.defaultString("abc"));
//nullだから空文字に置換
System.out.println("StringUtils.defaultString(\"null\") = " + StringUtils.defaultString(null));
//nullじゃないから置換しない
System.out.println("StringUtils.defaultString(\"abc\",\"def\") = " + StringUtils.defaultString("abc","def"));
//nullだから指定された文字に置換
System.out.println("StringUtils.defaultString(null,\"def\") = " + StringUtils.defaultString(null,"def"));
}
}
実行結果
StringUtils.defaultString("abc") = abc StringUtils.defaultString("null") = StringUtils.defaultString("abc","def") = abc StringUtils.defaultString(null,"def") = def
空文字やスペースだった場合の置換
nullだけではなく、空文字やスペースだった場合のデフォルト値も1行で置換できる。
import org.apache.commons.lang3.StringUtils;
public class StringUtilsDefaultTest {
public static void main(String[] args) {
//emptyだから置換
System.out.println("StringUtils.defaultIfEmpty(\"\",\"abc\") = " + StringUtils.defaultIfEmpty("","abc"));
//blankだか置換
System.out.println("StringUtils.defaultIfBlank(\" \",\"abc\") = " + StringUtils.defaultIfBlank(" ","abc"));
}
}
実行結果
StringUtils.defaultIfEmpty("","abc") = abc StringUtils.defaultIfBlank(" ","abc") = abc
文字列の比較(equals)
StringUtils.equals(equalsAny)は、 文字列比較もnullチェック不要で便利です。また「いずれかの場合」も簡単にチェックできる。ただし、NULL同士の比較もtrueになるため気を付けよう。
import org.apache.commons.lang3.StringUtils;
public class Main {
public static void main(String[] args) throws Exception {
//A同士の比較
System.out.println("StringUtils.equals(\"A\",\"A\") = " + StringUtils.equals("A","A"));
//nullとAの比較
System.out.println("StringUtils.equals(null,\"A\") = " + StringUtils.equals(null,"A"));
//NULL同士の比較
System.out.println("StringUtils.equals(null,null) = " + StringUtils.equals(null,null));
//大文字・小文字無視
System.out.println("StringUtils.equalsIgnoreCase(\"A\",\"a\") = " + StringUtils.equalsIgnoreCase("A","a"));
//いずれかと等しいかチェック
System.out.println("StringUtils.equalsAny(\"A\",\"A\",\"B\",\"C\") = " + StringUtils.equalsAny("A","A","B","C"));
//NULL同士の比較
System.out.println("StringUtils.equalsAny(null,null,\"B\",\"C\") = " + StringUtils.equalsAny(null,null,"B","C"));
//いずれかと等しいかチェック(大文字・小文字無視)
System.out.println("StringUtils.equalsAnyIgnoreCase(\"A\",\"a\",\"b\",\"c\") = " + StringUtils.equalsAnyIgnoreCase("A","a","b","c"));
}
}
実行結果
StringUtils.equals("A","A") = true StringUtils.equals(null,"A") = false StringUtils.equals(null,null) = true StringUtils.equalsIgnoreCase("A","a") = true StringUtils.equalsAny("A","A","B","C") = true StringUtils.equalsAny(null,null,"B","C") = true StringUtils.equalsAnyIgnoreCase("A","a","b","c") = true
配列チェック
配列の空チェック、Nullチェック
配列のnullやsize==0チェックもcommons langで提供されている。ArrayUtils.isEmptyでチェックしよう。
import org.apache.commons.lang3.ArrayUtils;
public class ArrayUtilsIsEmptyTest {
public static void main(String[] args){
String[] strs;
//配列数が0
strs = new String[]{};
System.out.println("(strs.length == 0) : " + ArrayUtils.isEmpty(strs));
//nullの場合
strs = null;
System.out.println("(strs == null) : " + ArrayUtils.isEmpty(strs));
}
}
実行結果
(strs.length == 0) : true (strs == null) : true
Collectionのチェック
MapやListの空チェック、nullチェック
Collectionのnullチェック、空チェックはCommons Collectionsから提供されています。CollectionUtils.isEmpty
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
public class CollectionUtilsIsEmptyTest {
public static void main(String[] args) {
List<?> list;
//要素数が0の場合
list = new ArrayList<>();
System.out.println("(list.size() == 0) : " + CollectionUtils.isEmpty(list));
//nullの場合
list = new ArrayList<>();
System.out.println("(list == null) : " + CollectionUtils.isEmpty(list));
}
}
実行結果
(list.size() == 0) : true (list == null) : true
MapUtils.isEmptyメソッドのサンプル
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.collections.MapUtils;
public class MapUtilsIsEmptyTest {
public static void main(String[] args){
Map<?, ?> map;
//要素数が0の場合
map = new HashMap<>();
System.out.println("(map.size() == 0) : " + MapUtils.isEmpty(map));
//nullの場合
map = null;
System.out.println("(map == null) : " + MapUtils.isEmpty(map));
}
}
実行結果
(map.size() == 0) : true (map == null) : true