1 -18 : カスタムequals

通常データクラスを自作した場合はclonableを実装したいりequalsメソッドをオーバーライドする。 Objectクラスに既にequalsメソッドが宣言されていて、内部では == による参照比較のみ行っている。そのため String.equals のように値による比較を行うには equals メソッドをオーバーライドする必要がある。通常 Object.equals と データクラス.ewuals メソッドの比較方法は異なるため、 equalsがObjectのメソッドか、自作メソッドかを把握してないとバグの原因となる可能性がある。ば

/**
* カスタム equals メソッド
*/
public class EqualsTest {

public static void main(String[] args) {
Num1 n1_1 = new Num1(1,2);
Num1 n1_2 = new Num1(1,2);
Num1 n1_3 = new Num1(2,3);
Num1 n1_4 = n1_1;

System.out.println("[カスタム equals による比較]");
System.out.println("n1_1 n1_2 : " + n1_1.equals(n1_2));
System.out.println("n1_1 n1_3 : " + n1_1.equals(n1_3));
System.out.println("n1_1 n1_4 : " + n1_1.equals(n1_4));
System.out.println("n1_2 n1_3 : " + n1_2.equals(n1_4));

Num2 n2_1 = new Num2(1,2);
Num2 n2_2 = new Num2(1,2);
Num2 n2_3 = new Num2(2,3);
Num2 n2_4 = n2_1;

System.out.println("[Object.equals による比較]");
System.out.println("n2_1 n2_2 : " + n2_1.equals(n2_2));
System.out.println("n2_1 n2_3 : " + n2_1.equals(n2_3));
System.out.println("n2_1 n2_4 : " + n2_1.equals(n2_4));
System.out.println("n2_2 n2_3 : " + n2_2.equals(n2_4));
}
}

/**
* カスタムequalsメソッドを定義したクラス
*/
class Num1 {
int a;
int b;

/**
* Constructor
*/
public Num1(int a, int b) {
this.a = a;
this.b = b;
}

public boolean equals(Object n) {
if (n == null) {
throw new NullPointerException();
} else if (!(n instanceof Num1)) {
return false;
}
Num1 num1 = (Num1)n;
return (a == num1.a && b == num1.b);
}
}

/**
* Object.equalsの比較のみを持つクラス
*/
class Num2 {
int a;
int b;

/**
* Constructor
*/
public Num2(int a, int b) {
this.a = a;
this.b = b;
}
}

実行結果
[カスタム equals による比較]
n1_1 n1_2 : true
n1_1 n1_3 : false
n1_1 n1_4 : true
n1_2 n1_3 : true
[Object.equals による比較]
n2_1 n2_2 : false
n2_1 n2_3 : false
n2_1 n2_4 : true
n2_2 n2_3 : false