1. 程式人生 > 程式設計 >Java自定義實現equals()方法過程解析

Java自定義實現equals()方法過程解析

這篇文章主要介紹了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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。