Objects.equals()とは何か
Javaで業務システムを開発していると、オブジェクト同士の値を比較する処理が頻繁に登場します。
例えば、
- ログインIDの比較
- 商品コードの比較
- データベース検索結果との照合
- 入力値チェック
- 更新前後の値比較
などです。
このような値比較で発生しやすい問題が「null」です。
そこで活躍するのが
Objects.equals()
です。
Objects.equals(比較対象1, 比較対象2)JavaこのメソッドはJava標準ライブラリが提供する「null安全な比較メソッド」です。
最大の特徴は、比較対象のどちらかがnullでも安全に比較できることです。
まずはString.equals()の問題を理解しよう
初心者が最初によく書くコードがこちらです。
// 商品コード
String code = null;
// 比較
if (code.equals("A001")) {
System.out.println("一致");
}Java一見問題なさそうに見えます。
しかし実行するとエラーになります。
NullPointerException
理由は簡単です。
codeがnullなのにequals()メソッドを呼び出そうとしているからです。
Javaでは存在しないオブジェクトのメソッドを呼び出せません。
これが業務システムの障害原因として非常によく発生します。
Objects.equals()が問題を解決する
同じ処理をObjects.equals()で書いてみましょう。
// 商品コード
String code = null;
// null安全比較
if (Objects.equals(code, "A001")) {
System.out.println("一致");
}Javaこのコードは例外を発生させません。
比較結果としてfalseを返します。
つまり、
- nullでも安全
- 例外が発生しない
- 比較結果だけ取得できる
というメリットがあります。
ステップバイステップで理解する
ステップ1:比較対象を準備する
// 比較対象
String value1 = "Java";
String value2 = "Java";Javaステップ2:Objects.equals()を実行する
// 値比較
boolean result =
Objects.equals(value1, value2);Javaステップ3:結果を確認する
// 結果表示
System.out.println(result);Java実行結果
true
同じ値なのでtrueになります。
様々な比較パターンを確認しよう
両方とも同じ値
// 同じ値
Objects.equals("Java", "Java");Java結果
true
異なる値
// 異なる値
Objects.equals("Java", "Python");Java結果
false
片方がnull
// 片方がnull
Objects.equals(null, "Java");Java結果
false
両方がnull
// 両方null
Objects.equals(null, null);Java結果
true
ここが重要なポイントです。
Objects.equals()は、 「両方ともnullなら同じもの」 と判断します。
内部でどのように動いているのか
イメージとしては次のような実装です。
// イメージコード
if (a == b) {
return true;
}
if (a == null || b == null) {
return false;
}
return a.equals(b);JavaつまりJava標準ライブラリ側でnullチェックを行ってくれています。
そのため開発者が毎回nullチェックを書く必要がありません。
なぜ業務開発で重要なのか
現実の業務データにはnullが頻繁に登場します。
- 未入力項目
- 未登録データ
- 検索結果なし
- 外部API取得失敗
- 設定値未定義
そのため比較処理を書く際には常にnullを考慮する必要があります。
Objects.equals()はその負担を大幅に減らしてくれます。
よくある実務例① ログインID比較
// DBから取得
String userId = getUserId();
// 入力値
String inputId = request.getUserId();
// null安全比較
if (Objects.equals(userId, inputId)) {
// 一致時処理
System.out.println("一致しました");
}Javaログイン処理や認証処理で非常によく見かけるパターンです。
よくある実務例② 更新判定
// 変更前
String oldName = customer.getOldName();
// 変更後
String newName = customer.getNewName();
// 値変更確認
if (!Objects.equals(oldName, newName)) {
// 更新処理
updateCustomer();
}Javaデータ更新判定では頻出の書き方です。
よくある実務例③ ステータス判定
// ステータス確認
if (Objects.equals(order.getStatus(), "COMPLETE")) {
// 完了処理
sendMail();
}Javaステータス管理システムでは非常によく利用されます。
Objects.equals()とString.equals()の違い
String.equals()
// 左辺がnullだと例外
name.equals("Java");Javanullの可能性がある場合は危険です。
Objects.equals()
// nullでも安全
Objects.equals(name, "Java");Javaこちらは例外が発生しません。
初心者がよく使う回避策との比較
初心者の方は次のような書き方を学ぶことがあります。
// リテラル側から比較
"Java".equals(name)Javaこれは非常に良い書き方です。
左辺が固定文字列なのでNullPointerExceptionになりません。
しかし比較対象が複雑になると、 Objects.equals()の方が読みやすい場合があります。
// より自然な比較
Objects.equals(name1, name2)Java実務で使えるテンプレート集
文字列比較テンプレート
// null安全比較
if (Objects.equals(value1, value2)) {
// 一致時処理
}Java変更検知テンプレート
// 値変更チェック
if (!Objects.equals(oldValue, newValue)) {
// 更新処理
}Javaステータス確認テンプレート
// ステータス判定
if (Objects.equals(status, "SUCCESS")) {
// 成功処理
}Javaデータ照合テンプレート
// 入力値とDB値比較
boolean matched =
Objects.equals(
inputValue,
dbValue
);Java特に重要:==との違い
初心者が必ず理解すべきポイントです。
==は参照比較
// 参照先比較
str1 == str2Javaオブジェクトの住所を比較しています。
equals()は値比較
// 値比較
Objects.equals(str1, str2)Java文字列内容を比較しています。
業務システムで文字列や業務データを比較する場合は、多くのケースでequals系を使用します。
情報セキュリティの観点から見る重要性
入力値比較は認証や認可、権限チェックなどの重要処理でも利用されます。
その際、NullPointerExceptionが発生すると、
- ログイン失敗
- サービス停止
- 処理中断
- 予期しないエラーページ表示
- 可用性低下
につながる可能性があります。
Objects.equals()を利用することで、想定されるnull値による障害リスクを軽減できます。
もちろん、認証情報や権限情報の比較ではnullになった原因そのものを調査することも重要です。
しかし、比較処理自体は安全に行うべきであり、そのための標準的な手段としてObjects.equals()が活用されています。
初心者が覚えておくべき重要ポイント
- nullでも安全に比較できる
- NullPointerExceptionを防げる
- 両方nullならtrueになる
- 値比較であり参照比較ではない
- 業務システムでは非常に利用頻度が高い
- 更新判定や状態判定で頻出する
- 迷ったらObjects.equals()を選ぶと安全
まとめ
Objects.equals()はJava標準ライブラリが提供するnull安全な比較メソッドです。
- nullを考慮した値比較ができる
- NullPointerExceptionを防止できる
- 両方nullならtrueになる
- 文字列比較や業務データ比較で頻繁に利用される
- 更新判定や照合処理との相性が良い
- コードの可読性と安全性を向上できる
- 実務開発では最も利用頻度の高いObjectsユーティリティのひとつ
特に業務システムでは「入力値や取得データには常にnullの可能性がある」という前提で設計することが重要です。Objects.equals()を活用すると、安全で読みやすく、保守しやすい比較処理を書くことができるため、Java開発者なら必ず身につけておきたい基本ユーティリティのひとつといえるでしょう。
