コツコツ学習ブログ

プログラマのweb上のメモ的なもの

equals()のオーバーライド

等値と等価(おさらい)

  • 等値(==) 同じアドレスを指していることを判定
  • 等価(equals) 2つのものが同じ内容であること

equals()のオーバーライド

これを行わないと、予期せぬ不具合が発生する可能性があるため クラスを作成したら必ずオーバーライドを行う

public class Main {
    public static void main(String[] args) {

        Account a1 = new Account();
        a1.accountNo = "001";

        //自分自身が引数として渡された場合、無条件でtrueを返す
        System.out.println(a1.equals(a1));
        //nullが引数として渡された場合、無条件でfalseを返す
        System.out.println(a1.equals(null));
        //型が異なるならばfalseを返す
        String s1 = "";
        System.out.println(a1.equals(s1));
        //型がおなじなら2つのインスタンスが持つフィールド同士を比較し等価か判定する
        Account a2 = new Account();
        a2.accountNo = "002";
        System.out.println(a1.equals(a2));
        a2.accountNo = "001";
        System.out.println(a1.equals(a2));

    }
}
public class Account {
    String accountNo;

    //equalsメソッドオーバーライドの定石
    public boolean equals(Object o) {
        //自分自身が引数として渡されたら、無条件でtrueを返す
        if (o == this)
            return true;
        //nullは引数として渡されたら、無条件でfalseを返す
        if (o == null)
            return false;
        //型が異なるならfalseを返す
        if (!(o instanceof Account))
            return false;
        //比較できるようキャスト
        Account r = (Account) o;
        //2つのインスタンスが持つしかるべきフィールド同士を比較して
        //等価かは判定しtrueかfalseを返す
        if (!this.accountNo.trim().equals(r.accountNo.trim())) {
            return false;
        }
        return true;
    }
}