014 継承(オブジェクトクラスの継承) 038 解答例

import java.util.Objects;

public class Person {
    private String name;
    private int age;

    // コンストラクタや他のメソッドなど

    @Override
    public boolean equals(Object obj) {
        // 自分自身と比較している場合はtrueを返す
        if (this == obj) {
            return true;
        }

        // 引数がnullでないことを確認
        if (obj == null) {
            return false;
        }

        // クラスが異なる場合はfalseを返す
        if (getClass() != obj.getClass()) {
            return false;
        }

        // 引数をPersonクラスにキャスト
        Person other = (Person) obj;

        // Objectsクラスのequalsメソッドを使用してフィールドが等しいかどうかを確認
        return Objects.equals(this.name, other.name) && this.age == other.age;
    }

    // 他のメソッドなど
}

この例では、Objects.equals メソッドを使用して name フィールドの比較を行っています。Objects.equals メソッドは、null セーフな比較を行います。このような比較が一般的に推奨されています。

equalsメソッド

equals メソッドは、Javaの Object クラスで定義されているメソッドで、オブジェクト同士の等価性を比較するために使用されます。以下は、equals メソッドの基本的な原則と使い方についての解説です。

equals メソッドの基本原則

  1. 反射性(Reflexive): 任意の非null参照のオブジェクト x に対して、x.equals(x)true を返さなければなりません。
  2. 対称性(Symmetric): 任意の非null参照のオブジェクト x および y に対して、x.equals(y)true を返す場合、y.equals(x)true を返さなければなりません。
  3. 推移性(Transitive): 任意の非null参照のオブジェクト xyz に対して、x.equals(y)true かつ y.equals(z)true の場合、x.equals(z)true を返さなければなりません。
  4. 整合性(Consistent): 任意の非null参照のオブジェクト xy に対して、x.equals(y) の複数回の呼び出しは、オブジェクトの変更がない限り、すべての呼び出しで同じ結果を返さなければなりません。
  5. nullとの比較(Comparison to null): 任意の非null参照のオブジェクト x に対して、x.equals(null)false を返さなければなりません。

equals メソッドの実装例

import java.util.Objects;

public class MyClass {
    private int value;

    // コンストラクタや他のメソッドなど

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        MyClass myObject = (MyClass) obj;
        return value == myObject.value;
    }

    @Override
    public int hashCode() {
        return Objects.hash(value);
    }
}

この例では、equals メソッドの実装には以下のようなステップがあります:

  1. 自分自身との比較: this == obj を使用して自分自身と引数が同じオブジェクトであるかをチェックします。同じオブジェクトであれば true を返します。
  2. null チェックとクラスの比較: 引数が null でないことを確認し、クラスが同じであるかをチェックします。異なるクラスであれば false を返します。
  3. フィールドの比較: クラスが同じであれば、各フィールドを比較して等価性を判定します。この例では value フィールドを比較しています。
  4. hashCode メソッドの実装: equals メソッドをオーバーライドする場合は、対応する hashCode メソッドもオーバーライドすることが推奨されます。Objects.hash メソッドを使用してハッシュコードを生成しています。

「014 継承」問題集リスト