Java自定義實現equals()方法過程解析
阿新 • • 發佈:2020-02-10
這篇文章主要介紹了Java自定義實現equals()方法過程解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
以常見的自定義Date型別為例,沒有經驗的朋友可能會覺得直接比較年月日即可,從而寫出以下的實現
public class MyDate implements Comparable<MyDate> { private final int year; private final int month; private final int day; public MyDate(int year,int month,int day) { this.year = year; this.month = month; this.day = day; } @Override public int compareTo(MyDate o) { throw new NotImplementedException(); } public boolean equals(Date that) { if (this.day != that.day) { return false; } if (this.month != that.month) { return false; } if (this.year != that.year) { return false; } return true; } }
但是想要健壯地實現equals()方法,上述程式碼是不夠的,參考以下程式碼
//定義為final型別:允許子類直接使用父類equals()方法是不安全的 public final class MyDate implements Comparable<MyDate> { private final int year; private final int month; private final int day; public MyDate(int year,int day) { this.year = year; this.month = month; this.day = day; } @Override public int compareTo(MyDate o) { throw new NotImplementedException(); } @Override //規定引數必須是Object型別 public boolean equals(Object obj) { //檢查是否相同引用 if (obj == this) { return true; } //檢查null if (obj == null) { return false; } //getClass()判斷的是準確的執行時型別,instanceof的型別可以是父類或介面 if (obj.getClass() != this.getClass()) { return false; } //這裡型別轉換一定是安全的 MyDate that = (MyDate) obj; //確認關鍵欄位都相等 if (this.day != that.day) { return false; } if (this.month != that.month) { return false; } if (this.year != that.year) { return false; } return true; } }
自定義equals方法的套路
- 檢查是否是同一個引用,如果是,返回true
- 檢查null值,如果是,返回false
- 檢查型別是否相同,如果不同,返回false;如果相同,進行型別轉換
對每個關鍵欄位進行比較:
4.1 如果欄位是基本型別,使用==
4.2 如果欄位是物件型別,使用物件的equals()方法
4.3 如果欄位是個陣列,比較陣列的每個元素。可以考慮使用Arrays.equals(a,b)或者Arrays.deepEquals(a,b),但不是a.equals
(b)
建議
- 如果一個欄位的值完全依賴其他欄位的值,可以不用比較
- 優先比較最可能出現差異的欄位
- 如果物件實現了compareTo()方法,可以直接拿來使用。例如x.compareTo(y) == 0
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。