2010-12-17 71 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(); 
    } 
} 
相关问题