1. 導入:なぜObjects.compareが必要なのか
Javaでプログラミングをしていると、2つのオブジェクトの大小関係を比較したい場面によく遭遇します。単純な数値であれば「<」や「>」演算子が使えますが、自作クラスのインスタンスや、nullが含まれる可能性がある場合、比較処理は複雑になりがちです。
java.util.Objects.compareメソッドを使うと、null安全に、かつ可読性の高いコードで比較を行うことができます。「nullでプログラムが落ちた」というバグを防ぎたい初心者の方には、ぜひ習得していただきたいテクニックです。
2. 基礎知識:Comparatorとは
比較を行う際に登場する重要なインターフェースがComparatorです。これは「2つのオブジェクトをどのように比較するか」というルール(比較順序)を定義するものです。
例えば、文字列の長さで比較したい場合や、社員番号の昇順で並び替えたい場合など、比較の基準を自由にカスタマイズできます。Objects.compareは、このComparatorを引数として受け取り、内部で適切に比較を実行してくれる便利な補助メソッドです。
3. 実装/解決策
Objects.compare(a, b, comparator)は、以下のルールで動作します。
1. aとbが等しい場合は0を返します。
2. それ以外の場合は、comparatorのcompareメソッドの結果(負の数、0、正の数)をそのまま返します。
3. 重要なのは、引数にnullが含まれていても例外(NullPointerException)を発生させず、適切に処理できる点です。
4. サンプルプログラム
以下のコードは、数値(Integer)を比較する簡単な例です。コピーしてそのまま実行できます。
import java.util.Comparator;
import java.util.Objects;
public class CompareSample {
public static void main(String[] args) {
Integer val1 = 10;
Integer val2 = 20;
// Comparatorをラムダ式で定義(昇順)
Comparator
// Objects.compareを使用して比較
int result = Objects.compare(val1, val2, comparator);
if (result < 0) {
System.out.println(val1 + " は " + val2 + " より小さいです。");
} else if (result > 0) {
System.out.println(val1 + ” は ” + val2 + ” より大きいです。”);
} else {
System.out.println(val1 + ” と ” + val2 + ” は等しいです。”);
}
}
}
5. 応用・注意点
現場での開発では、以下の点に注意してください。
nullの扱いを意識する
Objects.compareはnullを許容しますが、内部で呼び出されるComparatorの実装側がnullを受け取れない場合、そこでNullPointerExceptionが発生します。nullが含まれる可能性がある場合は、Comparator.nullsFirst()やComparator.nullsLast()といったメソッドを組み合わせて、nullを考慮したComparatorを作成するのがプロの流儀です。
演算子との使い分け
プリミティブ型(int, doubleなど)の比較であれば、素直に「<」や「==」といった演算子を使うのが最も高速でシンプルです。オブジェクトの比較や、コレクションの並び替えなど、「比較のルールを柔軟に変更したい」という時にこそ、Objects.compareとComparatorの組み合わせを活用してください。

コメント