与使用equals和hashcode相比,实现工具是否是一个坏主意(可能会有我忽略的后果)?我不关心元素的排序我只需要将排序确定为确定性。这当然是假设我的equals和hashcode是正确的。
这是我的compareTo看起来像
@Override
public int compareTo(DividendEvent other) {
final int BEFORE = -1;
final int EQUAL = 0;
final int AFTER = 1;
if(other == null){
return BEFORE;
}
else if (this.equals(other)){
return EQUAL;
}
else if (this.hashCode()>other.hashCode()){
return AFTER;
}
else{
return BEFORE;
}
}
答案 0 :(得分:2)
重要的是要避免"奇怪的事情"是遵守the contract of compareTo
,即:
sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
(x.compareTo(y)>0 && y.compareTo(z)>0)
隐含x.compareTo(z)>0
x.compareTo(y)==0
表示所有sgn(x.compareTo(z)) == sgn(y.compareTo(z))
z
对于不相等但具有相同哈希码的对象,您的实现不会勾选第一个框。
您可以修改它:
else if (this.equals(other) || this.hashCode() == other.hashCode()){
勾选三个方框。然后你的实现将与equals不一致,但除此之外它看起来还不错。
假设您的hashCode
对于给定对象是常量。
答案 1 :(得分:0)
有时框架要求你覆盖.equals()以便工作,(我在jsf + ejb中遇到过这种情况),并且这种类型的实现需要根据对象ID进行相等性检查。当你以这种方式实现compareTo时,你的逻辑是"比较"对象与此不同,这会导致混淆。
如果这些类是您的域对象而您没有在其他图层中使用它们,那么它可能没问题。我只是认为.equals方法以技术方式表示相等(例如相同的数据库ID),以及一些其他方法,如.identical(),您以业务逻辑方式实现。