假设我们有以下课程:
public class SingleElementRefType
{
protected JAXBElement<SequenceType> sequence;
// ...
}
它包含JAXBElement
类型的sequence
字段。
JAXBElement
是第三方类(实际上是标准API),它本质上是纯值类,但由于某种原因它不实现hashCode
和equals
方法
从我的观点来看,这些方法在那里绝对合理。
我想为equals
以及hashCode
实施SingleElementRefType
和SequenceType
方法,以便我可以对这些值进行深入比较。但是JAXBElement
阻碍了它。
由于我无法扩展JAXBElement
,我的想法是将hashCode
和equals
集成到聚合类(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));
但是如果我没有在这里违反某些约定或规则,我还有第二个想法。
在我的聚合类中对第三方类实施hashCode
和equals
是否有任何危险?
更新:由于某些原因,我的代码可能没有进一步的运行时依赖性。所以我不能在这里使用Guava或commons-lang
。
答案 0 :(得分:0)
覆盖模型类的hashCode和equals方法是完全合理的。在覆盖它们时,java指定要遵循的合同列表。
对于equals,
对于hashCode,
这个answer可以让您深入了解覆盖hashCode()时要遵循的最佳做法。
对于压倒平等,请遵循以下做法:
您可以确保重写的hashCode和equals方法有效遵循合同的方法是使用Junits测试它们。 在某些时候,必须在基于散列的集合中使用模型类,比如散列映射或散列集时,需要重写hashCode和equals会更加明显。