2010-12-17 57 views
0

我有一個包,我不能改變的類。這個類不會覆蓋Object.equals()並且具有不同的equals實現會使我的代碼更加清晰。正確的方式來擴展一個類,所以我可以覆蓋等於()

我知道我不能做到這一點:

MyClass extends OtherClass{ 
@Override 
public boolean equals(MyClass that) 
{ 
//compare members and other stuff here 
} 
} 

OtherClass oc1 = new OtherClass(); 
OtherClass oc2 = new OtherClass(); 
oc1.equals(oc2); //false because of Object.equals 
//I want to do something like the following 
MyClass mc1 = (MyClass) oc1; //throws class cast exception 
MyClass mc2 = (MyClass) oc2; //throws class cast exception 
mc1.equals(mc2); //true 

什麼是實現這一目標的正確方法?

我可以寫一個像equals(OtherClass oc1,OtherClass oc2)的方法,但是這個方法不太實用。如果我可以實現平等,我可以利用List.contains或Sets來管理我的數據並使生活更輕鬆。

回答

4

如何創建包裝類?

MyWrapper { 
    private OtherClass data; 

    MyWrapper(OtherClass data) { 
     this.data = data; 
    } 

    public boolean equals(Object that) { 
     ... 
    } 
} 

如有必要,爲存儲對象添加吸氣劑。

+0

和equals()將比較,爲正確的數據? – Freiheit 2010-12-17 20:26:49

+0

@Freiheit是的,'equals'會做你編程的任何事情。 – 2010-12-17 20:27:54

+0

-1 - 用於實現沒有hashCode的equals。 – 2010-12-17 21:34:31

-1

我用Google搜索,發現這個:example

+0

他不能改變班級。所有這些例子都說明了如何讓Eclipse爲你編寫equals()和hashCode()。 – Poindexter 2010-12-17 20:39:38

+0

啊,完全誤讀了第一行。道歉。問題的標題並沒有說什麼不能改變班級......錯過了。 – jaydel 2010-12-17 20:41:43

1

不覆蓋equals,而不是覆蓋hashCode。另外,擁抱Apache Commons lang,它提供了許多有用的類。使用Apache下議院EqualsBuilder和Apache下議院HashCodeBuilder類你的類 - 即,提供最失蹤等於操作將是這個樣子:

public class NiceBerry extends NaughtyBerry 
{ 
    public boolean equals(Object rhsObject) 
    { 
     if (rhsObject == null) 
     { 
      return false; 
     } 

     if (rhsObject == this) 
     { 
      return true; 
     } 

     if (rhsObject instanceof NiceBerry) 
     { 
      EqualsBuilder equalsBuilder = new EqualsBuilder(); 
      NiceBerry rhs = (NiceBerry)rhsObject; 

      equalsBuilder.append(getField1(), rhs.getField1()); 
      equalsBuilder.append(getField2(), rhs.getField2()); 
      ... append all the naughty berry fields 

      return equalsBuilder.isEquals(); 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public int hashCode() 
    { 
     // you pick a hard-coded, randomly chosen, non-zero, odd number 
     // ideally different for each class 
     HashCodeBuilder hashBuilder = new HashCodeBuilder(17, 37); 

     hashBuilder.append(getField1()); 
     hashBuilder.append(getField2()); 
     ... append all the naughty berry fields 

     return hashBuilder.toHashCode(); 
    } 
} 
相關問題