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
メソッドの基本原則
- 反射性(Reflexive): 任意の非null参照のオブジェクト
x
に対して、x.equals(x)
はtrue
を返さなければなりません。 - 対称性(Symmetric): 任意の非null参照のオブジェクト
x
およびy
に対して、x.equals(y)
がtrue
を返す場合、y.equals(x)
もtrue
を返さなければなりません。 - 推移性(Transitive): 任意の非null参照のオブジェクト
x
、y
、z
に対して、x.equals(y)
がtrue
かつy.equals(z)
がtrue
の場合、x.equals(z)
もtrue
を返さなければなりません。 - 整合性(Consistent): 任意の非null参照のオブジェクト
x
、y
に対して、x.equals(y)
の複数回の呼び出しは、オブジェクトの変更がない限り、すべての呼び出しで同じ結果を返さなければなりません。 - 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
メソッドの実装には以下のようなステップがあります:
- 自分自身との比較:
this == obj
を使用して自分自身と引数が同じオブジェクトであるかをチェックします。同じオブジェクトであればtrue
を返します。 - null チェックとクラスの比較: 引数が
null
でないことを確認し、クラスが同じであるかをチェックします。異なるクラスであればfalse
を返します。 - フィールドの比較: クラスが同じであれば、各フィールドを比較して等価性を判定します。この例では
value
フィールドを比較しています。 hashCode
メソッドの実装:equals
メソッドをオーバーライドする場合は、対応するhashCode
メソッドもオーバーライドすることが推奨されます。Objects.hash
メソッドを使用してハッシュコードを生成しています。