@EqualsAndHashCodeの使い方と基本を徹底解説!【初心者向け】

はじめに

こんにちは!
今回は、Javaのライブラリ「Lombok」のアノテーションである@EqualsAndHashCodeについて解説します。
データクラスの設計や比較処理を効率化できる強力なツールです。「equals()」や「hashCode()」メソッドの自動生成について詳しく知りたい方は必見!サンプルコードを交えてわかりやすく説明します。


@EqualsAndHashCodeとは?

定義

**@EqualsAndHashCode**は、Javaクラスにおけるequals()hashCode()メソッドを自動生成するLombokのアノテーションです。

  • equals()メソッドは、オブジェクト同士が「意味的に等しいか」を比較します。
  • hashCode()メソッドは、オブジェクトをハッシュ化して数値を返します(HashMapやHashSetで利用される)。

なぜ必要?

通常、Javaでequals()hashCode()を自分で書く場合、フィールドごとの比較や計算ロジックを書く必要があり、コードが長くなりがちです。しかし、Lombokの@EqualsAndHashCodeを使えば、必要なフィールドを基にこれらのメソッドを自動で生成してくれます。


基本的な使い方

以下に、@EqualsAndHashCodeを使ったシンプルな例を示します。

import lombok.EqualsAndHashCode;

@EqualsAndHashCode
public class Person {
    private String name;
    private int age;
}

このコードでできること

  • nameageを基に、equals()hashCode()が自動生成されます。
  • 生成されたequals()は、nameageの値が同じ場合に「等しい」と判断します。
  • 生成されたhashCode()は、nameageを基にハッシュ値を計算します。

動作確認してみよう!

例: equals()の動作

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("Alice", 25);
        Person p2 = new Person("Alice", 25);
        Person p3 = new Person("Bob", 30);

        System.out.println(p1.equals(p2)); // true
        System.out.println(p1.equals(p3)); // false
    }
}
  • p1p2は等しい
    nameageの値が一致しているため、equals()trueを返します。
  • p1p3は等しくない
    nameもしくはageが異なるため、equals()falseを返します。

応用編: フィールドをカスタマイズ

1. 特定のフィールドを比較対象から除外する

exclude属性を使用することで、equals()hashCode()の比較対象から特定のフィールドを外せます。

@EqualsAndHashCode(exclude = "age")
public class Person {
    private String name;
    private int age;
}

動作例

Person p1 = new Person("Alice", 25);
Person p2 = new Person("Alice", 30);
System.out.println(p1.equals(p2)); // true
  • ageを無視
    この場合、nameだけが比較されるため、equals()trueを返します。

2. スーパークラスのフィールドを含める

callSuper属性を使用すると、スーパークラスのフィールドも比較対象に含めることができます。

@EqualsAndHashCode(callSuper = true)
public class Employee extends Person {
    private int employeeId;
}
  • スーパークラスPersonのフィールドnameageも比較されます。
  • 親子クラスで共通のequals()hashCode()を簡単に設定可能。

実用例

1. ハッシュベースのコレクションで利用する

hashCode()は、HashMapHashSetでのデータ管理に重要です。

import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Set<Person> people = new HashSet<>();
        people.add(new Person("Alice", 25));
        people.add(new Person("Alice", 25)); // 重複なので追加されない
        people.add(new Person("Bob", 30));

        System.out.println(people.size()); // 2
    }
}
  • equals()hashCode()を正しく実装することで、HashSetが重複データを適切に管理します。

よくある疑問

Q1: すべてのフィールドを比較対象にするべき?

A: 必ずしもそうではありません。用途に応じて重要なフィールドだけを対象にするのがベストです。

Q2: スーパークラスのequals()と競合しない?

A: callSuper属性を明示的に指定することで解決できます。

Q3: @Dataと@EqualsAndHashCodeの違いは?

A: @Dataには@EqualsAndHashCodeが含まれていますが、独立して使う場合は、カスタマイズ性が高い@EqualsAndHashCodeが便利です。


まとめ

今回は、Lombokの@EqualsAndHashCodeについて解説しました。
このアノテーションを使うことで、コードの簡潔化と開発効率の向上が期待できます。

ポイント

  1. equals()hashCode()を自動生成
  2. 比較対象のカスタマイズが可能
  3. HashMapHashSetで便利

もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。

他の記事が見たい方はこちら!↓↓↓

タイトルとURLをコピーしました