Java:可以实现hashCode并且等于第三方类吗?

时间:2014-11-29 16:03:11

标签: java jaxb equals hashcode

假设我们有以下课程:

public class SingleElementRefType
{

    protected JAXBElement<SequenceType> sequence;

    // ...
}

它包含JAXBElement类型的sequence字段。

JAXBElement是第三方类(实际上是标准API),它本质上是纯值类,但由于某种原因它不实现hashCodeequals方法

从我的观点来看,这些方法在那里绝对合理。

我想为equals以及hashCode实施SingleElementRefTypeSequenceType方法,以便我可以对这些值进行深入比较。但是JAXBElement阻碍了它。

由于我无法扩展JAXBElement,我的想法是将hashCodeequals集成到聚合类(SingleElementRefType这里):

JAXBElement<SequenceType> theSequence;
theSequence = this.getSequence();

final QName theSequenceName = theSequence.getName();
currentHashCode = ((currentHashCode* 37) +
    ((theSequenceName!= null)?theSequenceName.hashCode(): 0));

final Object theSequenceValue = theSequence.getValue();
currentHashCode = ((currentHashCode* 37) +
    ((theSequenceValue!= null)?theSequenceValue.hashCode(): 0));

但是如果我没有在这里违反某些约定或规则,我还有第二个想法。

在我的聚合类中对第三方类实施hashCodeequals是否有任何危险?

更新:由于某些原因,我的代码可能没有进一步的运行时依赖性。所以我不能在这里使用Guava或commons-lang

1 个答案:

答案 0 :(得分:0)

覆盖模型类的hashCode和equals方法是完全合理的。在覆盖它们时,java指定要遵循的合同列表。

对于equals,

  • reflexive [x.equals(x)= true]
  • 对称[x.equals(y)= true,然后(y.equals(x)== true)]
  • 传递[x.equals(y)== true&amp;&amp; y.equals(z)== true,然后x.equals(z)== true]
  • 一致的
  • 'non-nullity'[x.equals(null)== false]

对于hashCode,

  • 一致性:为同一个对象返回相同的整数
  • if(o1.equals(o2),then o1.hashcode == o2.hashcode)
  • 不是反之亦然

这个answer可以让您深入了解覆盖hashCode()时要遵循的最佳做法。

对于压倒平等,请遵循以下做法:

  • 使用==检查参数是否是对此对象的引用
  • 使用instanceof运算符检查参数是否具有正确的类型
  • 将参数转换为正确的类型
  • 对于类中的每个“重要”字段,检查参数的该字段是否与此对象的相应字段匹配

您可以确保重写的hashCode和equals方法有效遵循合同的方法是使用Junits测试它们。 在某些时候,必须在基于散列的集合中使用模型类,比如散列映射或散列集时,需要重写hashCode和equals会更加明显。