2009年12月22日 星期二

JAVA筆記-覆寫equals()與hashCode()

之前寫Collection,看到這兩個方法,就很想使用
但要用的近乎人意,卻要很費一番功夫

沒有被覆寫的equals是比較兩物件的參考位置,物件不同則傳回false
若要比對兩物件屬性內容值,則要自己覆寫
並且也一併覆寫hashCode,不同物件會有不同hash code
若兩物件equals()相等,hashCode()也必須相等,否則可能會有錯誤問題
尤其是Hash-Based Collection會用到

/* equals()覆寫例子 */

public boolean equals(Object obj) {

  //若同一物件則true
  if (this == obj) return true;

  //getClass()會可用來判斷物件是否屬於同一類別
  if(obj != null && getClass() == obj.getClass()){
    if(obj instanceof Ball) {
      Ball ball = (Ball)obj;
      //比對屬性內容值
      if (tradeMark.equals(ball.tradeMark) &&
          kind.equals(ball.kind) &&
          color.equals(ball.color)) {
        return true;
      }
    }
  }
  return false;
}


覆寫hashCode()不容易,
使用jakarta所提供的HashCodeBuilder類別,
下載commons-lang-2.1.jar,
看到這裡,懶惰的我,也想放棄了,
真的要用到再說吧!

/* hashCode()覆寫例子 */

import org.apache.commons.lang.builder.HashCodeBuilder;//加入外掛

public int hashCode() {
  return new HashCodeBuilder(17, 37). //應放入兩個質數
    append(tradeMark). //利用append()加入參與的物件變數
    append(kind).
    append(color).
    toHashCode(); //最後取得hash code數值
}

0 意見 :

張貼留言