【发布时间】:2010-03-13 20:11:32
【问题描述】:
我相信这个问题同样适用于 C# 和 Java,因为两者都要求 {c,C}ompareTo 与 {e,E}quals:
假设我希望我的 equals() 方法与参考检查相同,即:
public bool equals(Object o) {
return this == o;
}
在这种情况下,我如何实现 compareTo(Object o)(或其通用等效项)?其中一部分很容易,但我不确定另一部分:
public int compareTo(Object o) {
MyClass other = (MyClass)o;
if (this == other) {
return 0;
} else {
int c = foo.CompareTo(other.foo)
if (c == 0) {
// what here?
} else {
return c;
}
}
}
我不能只是盲目地返回 1 或 -1,因为解决方案应该遵守 compareTo 的正常要求。我可以检查所有实例字段,但如果它们都相等,我仍然希望 compareTo 返回一个非 0 的值。 a.compareTo(b) == -(b.compareTo(a) 应该是真的),并且只要对象的状态没有改变,顺序就应该保持一致。
不过,我不关心虚拟机调用的顺序。这让我觉得我可以使用像内存地址这样的东西,如果我能做到的话。再说一次,也许这行不通,因为垃圾收集器可以决定移动我的对象。
hashCode 是另一个想法,但我想要一些始终独特的东西,而不仅仅是大部分独特的东西。
有什么想法吗?
【问题讨论】:
-
我不明白。如果对象没有合理的逻辑排序,那你为什么还需要排序呢?如果您的对象在逻辑上不能相互比较,请不要费心实现 Comparable。你想解决什么问题?
-
您可以使用 Object.ReferenceEquals(a,b) 来检查它是否是完全相同的对象。
-
@Joren:我的对象确实有逻辑顺序,但是一旦我完成了它们的所有状态,当 equals 检查引用相等性时,我仍然需要 compareTo 与 equals 保持一致。
-
您不需要检查对象的实例,因为 compareTo 允许抛出 CastClassException(与 equals() 不同)。此外,
return false在这里是不合法的 - 这可能是从您的equals方法之一复制而来的? -
保罗,如果他们有一个逻辑顺序,那么把它放在你的 equals 方法中。在 C# 中,您始终可以使用 Java
==运算符和Object.ReferenceEquals()获得引用等于。任何一种语言的引用都不能使用 > (+1) 或