考虑一个具有可比较(与 equals 一致)和不可比较字段(我不知道它是否覆盖的类Object#equals
)的类。
应比较类的实例,其中结果顺序应与 equals 一致,即0
如果两个字段相等(根据Object#equals
)并且与可比较字段的顺序一致,则返回。我曾经System.identityHashCode
涵盖了这些要求未涵盖的大多数情况(具有相同可比性但不同其他值的实例的顺序是任意的),但不确定这是否是最佳方法。
public class MyClass implements Comparable<MyClass> {
private Integer intField;
private Object nonCompField;
public int compareTo(MyClass other) {
int intFieldComp = this.intField.compareTo(other.intField);
if (intFieldComp != 0)
return intFieldComp;
if (this.nonCompField.equals(other.nonCompField))
return 0;
// ...and now? My current approach:
if (Systems.identityHashCode(this.nonCompField) < Systems.identityHashCode(other.nonCompField))
return -1;
else
return 1;
}
}
我在这里看到两个问题:
- 如果
Systems.identityHashCode
两个对象相同,则每个对象都大于另一个对象。(这会发生吗?) intField
据我所知,具有相同值和不同值的实例的顺序nonCompField
在程序运行之间不必保持一致Systems.identityHashCode
。
那是对的吗?还有更多问题吗?最重要的是,有没有办法解决这个问题?