null判定やオブジェクト比較に便利! java.util.Objectsの便利なメソッド5選
目次
こんにちは。いろんなユーティリティメソッドを使い倒したい堀部です。
今回はJavaでよく実装するnullチェックやオブジェクトの比較、String型への変換が楽になる、java.util.Objectsクラスを紹介したいと思います。
java.util.ObjectsはJava 7で新しく導入され、Java 8でさらにメソッドが追加された標準APIです。これを使うと毎回のように書いていたユーティリティメソッドを省略できるようになるかもしれません。
今回紹介するメソッドのまとめ
今回ご紹介するメソッドは、下記の5つです。java.util.Objectsの詳細はJavaDocをご覧ください。
メソッド名 | 引数 | 戻り値 |
---|---|---|
equals・deepEquals | Object a, Object b | boolean |
toString | Object o, String nullDefault | String |
compare | T a, T b, Comparator super T> c | int |
isNull・nonNull | Object obj | boolean |
requireNonNull | T obj T obj, String message T obj, Supplier |
<T>T |
equals・deepEquals:オブジェクトを比較
equalsは2つの引数が等しいかを比較するメソッドです。引数がどちらもnullの場合もtrueとなります。
deepEqualsは配列などの要素に対して再帰的に比較が行えます。配列要素が全て等しい場合にtrueを返します。
if(Objects.equal(a, b)) { // 等価の場合の処理 } if(Objects.deepEquals(new Object[] {a,b}, new Object[] {a,b})) { // 等価の場合の処理 }
toString:String型へ変換
toStringは引数に渡した値をString型に変換して返します。引数がnullであった場合、”null”という値が返されます。
nullの場合に返す値を変更したい場合は、2番目の引数に任意の文字列を指定します。
Object obj = null; System.out.println(Objects.toString(obj)); System.out.println(Objects.toString(obj, "nullです。"));
compare:オブジェクトを比較
compareは1番目と2番目の引数を比較し、同じ場合は0を返します。異なる場合は3番目の引数に指定したComparatorでの比較結果を返します。
switch (Objects.compare(a, b, Comparator.naturalOrder())) { case 0: System.out.println("a は b と同じ"); break; case -1: System.out.println("a は b より小さい"); break; case 1: System.out.println("a は b より大きい"); break; }
isNull・nonNull:nullをチェック
isNullは引数がnullの場合にtrueを返します。nonNullは逆にnull以外の場合にtrueを返します。
if(Objects.isNull(obj)) { // nullの場合の処理 } if(Objects.nonNull(obj)) { // null以外の場合の処理 }
requireNonNull:nullでないことをチェック
requireNonNullは引数がnullでないことをチェックします。nullの場合はNullPointerExceptionが発生します。2番目の引数を指定することでカスタマイズしたNullPointerExceptionを返すことができます。
NullPointerExceptionの発生にはコストがかかりますので、基本的にはnullにならない変数に対して使用するのが良いと思います。
this.obj = Objects.requireNonNull(obj); this.obj = Objects.requireNonNull(obj, "nullです."); this.obj = Objects.requireNonNull(obj, () -> "abc");
まとめ
いかがでしたでしょうか?
今回ご紹介したユーティリティメソッドはApache Commonsなどのライブラリにもありますが、標準APIにあるのであればこちらを積極的に使っていきたいですね。
サンプルの中で使用した、ComparatorやSupplierについても機会があればご紹介したいと思います。
≪関連記事≫