1. 導入:なぜObjects.equalsが必要なのか
Javaの実務開発において、最も遭遇頻度が高いエラーの一つが「NullPointerException(NPE)」です。特にオブジェクトの比較を行う際、うっかり片方の変数がnullである状態で .equals() メソッドを呼び出し、システムをクラッシュさせてしまった経験はないでしょうか。
本記事では、この課題をスマートに解決し、可読性と安全性を高める java.util.Objects.equals() の活用法について解説します。
2. 基礎知識:null安全とは何か
Javaのオブジェクト比較において、基本となるのは Object.equals() です。しかし、a.equals(b) と記述した場合、もし変数 a が null であれば即座にNPEが発生します。
これを回避するために、かつては if (a != null && a.equals(b)) のようなガード句を書いていましたが、条件式が複雑になり、コードの可読性が低下するという問題がありました。
java.util.Objects.equals(a, b) は、内部で null チェックを自動的に行い、安全に比較結果(boolean)を返してくれるユーティリティです。
3. 実装/解決策:論理的な比較の仕組み
Objects.equals(a, b) の内部ロジックは非常にシンプルです。
1. 両方の引数が同一インスタンスであれば true を返す。
2. 片方が null であれば false を返す。
3. 両方とも null でなければ、a.equals(b) の結果を返す。
この仕組みにより、開発者はnullの状態を意識することなく、安心して比較処理を記述できます。
4. サンプルプログラム
以下のコードは、現場でよくある「ユーザー入力値とDB値の比較」を想定したサンプルです。
import java.util.Objects;
public class EqualityCheckSample {
public static void main(String[] args) {
String inputName = null; // ユーザー入力が空の場合を想定
String dbName = “Admin”;
// 従来の危険な書き方(inputNameがnullだとNPEになる)
// if (inputName.equals(dbName)) { … }
// 推奨される書き方:Objects.equalsを使用
if (Objects.equals(inputName, dbName)) {
System.out.println(“名前が一致しました。”);
} else {
// ここが実行される(nullと”Admin”は等しくないため)
System.out.println(“名前が一致しませんでした。”);
}
// 両方nullの場合の挙動
String val1 = null;
String val2 = null;
// 両方nullの場合は true を返す設計になっている
boolean isBothNull = Objects.equals(val1, val2);
System.out.println(“両方nullならtrue: ” + isBothNull);
}
}
5. 応用・注意点:現場でのベストプラクティス
実務でさらにコードを洗練させるための注意点をまとめます。
プリミティブ型との混同に注意
Objects.equals はオブジェクトの比較専用です。int や double などのプリミティブ型を比較する場合は、直接 == 演算子を使用してください。
instanceof パターンマッチングとの併用
Java 16以降では instanceof のパターンマッチングが導入されています。型変換を安全に行う際はそちらを使い、値の等価比較が必要な場面では迷わず Objects.equals を使い分けるのが「モダンJava」の定石です。
定数との比較順序
「”Admin”.equals(inputName)」のように、定数を左側に置くテクニックもありますが、コード全体で一貫性を持たせるために、プロジェクト全体で Objects.equals を統一的に利用することをお勧めします。これにより、nullチェックの漏れというヒューマンエラーを組織的に排除できます。

コメント