我相信這個問題同樣適用於C#,因爲它們都需要{c,C} ompareTo與{e,E} quals一致:C#/ Java:正確實施CompareTo當Equals測試參考身份
假設我想我的equals()方法是相同的參考檢查,即:
public bool equals(Object o) {
return this == o;
}
在這種情況下,我該如何實現的compareTo(對象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.compareTo(一) ),只要對象的狀態沒有改變,順序應該保持一致。
我不關心整個虛擬機的調用訂貨,但是。這讓我覺得我可以使用類似內存地址的東西,如果我能夠做到的話。再說,也許這是行不通的,因爲垃圾收集器可以決定走動我的對象。
hashCode是另一種想法,但我想要的東西總是總是獨特的,而不僅僅是獨特的。
任何想法?
我不明白。如果對象上沒有合理的*邏輯*排序,爲什麼你需要有一個排序呢?如果您的對象在邏輯上不能相互比較,請不要打擾實施Comparable。你想解決什麼問題? – Joren
您可以使用Object.ReferenceEquals(a,b)來檢查它是否是完全相同的對象。 –
@Joren:我的對象確實有一個邏輯順序,但是一旦我經歷了他們所有的狀態,當equals檢查引用相等時,我仍然需要compareTo與equals相等。 –