等値と等価(おさらい)
- 等値(==) 同じアドレスを指していることを判定
- 等価(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; } }