2012-08-01 19 views
-1

這是個好主意嗎?現在如何解決,如果沒有的話?實現對象的「絕對等於」方法(稱爲same()或same())。好主意?

我認爲這將是有趣添加

final boolean identical(Obj obj){ 
    return (this==obj); 
} 

,所以我們有一個改進的equals(邏輯等於)

boolean equals (Obj obj){ 
    return identical(obj); // by default, but its overrideable 
} 

這個問題從需求arised在這個其他問題(A Mechanism for having different equals (physical equals and logical equals) on objects in Collection)有一種方法可以將相同指針的列表與同等對象列表進行比較。有了這個想法,我們可以添加到收集界面:

coll.equals(coll2) 
coll.identical(coll2) 
coll.identicalElem(coll2){ 
     //current equals implementation of collections but calling identical to compare objects 
} 

您怎麼看?

+7

你的方法和'=='有什麼區別? – 2012-08-01 11:50:51

+0

如果你想比較身份而不是「平等」,只是不要在你自己的對象中重寫'equals()'... – 2012-08-01 11:52:03

+0

這是一個重新發明車輪的例子。主要的(在我看來)這發生在有人發現自己比他們面前的所有計算機科學家都更聰明。 – Woot4Moo 2012-08-01 12:25:03

回答

2

您發佈的默認equals()實施已經是java.lang.Object中的一個。用相同的實現覆蓋它沒有意義。

關於你提到的3種方法添加到集合接口:

coll.equals(coll2):這個人是已經在Collection接口。

coll.identical(coll2):等效於coll == coll2,但可讀性較差。我沒有看到這種方法的重點。

coll.identicalElem(coll2):這種方法確實不存在,但我從來沒有這樣的方法的需要,所以我認爲它不應該混亂的集合的API。你可以使用番石榴的Equivalence來做到這一點:

Equivalence.identity().pairWise().equivalent(coll1, coll2); 
+0

第三個是我提出這個問題的線索。我如何判斷一個集合是一個淺拷貝還是一個包含所有對象的深拷貝obj1.equals(obj2)?我試試你的方法! – Whimusical 2012-08-01 12:34:45

2

我不知道您是否知道這一點,但標準Java API中已經有了IdentityHashMap。此外,您可以使用System.identityHashCode生成對象的哈希碼。

0

對象上現有的「equals」方法已經做到了 - 對吧?

下面是代碼:

public boolean equals(Object obj) { 
     return (this == obj); 
    } 

所以,如果你爲「等於」的實現它執行,如果沒有(那麼默認情況下),它使用「==」的

+0

是的,但它可以被覆蓋,所以你永遠不能確定兩個對象是等於IF和只有他們是相同的(或==)。讓他們之間比較兩個列表。即使它們看起來不是同一個實例,它們也是如此。 – Whimusical 2012-08-01 12:31:43

0

這不是一個好主意,因爲equals(Object)正在測試一個類的兩個實例是否相等,如果它們代表相同的實例(即它們的指針是相等的),則不會。

如果你實現了「改進」等於方法,你將得到如下結果: new Rectangle(1, 2).equals(new Rectangle(1, 2))返回false,這是荒謬的。

此外,還有大量代碼依賴於當前定義的equals方法(例如HashMaps使用它來解析不同對象的哈希碼衝突)。沒有特別的原因,事情會在各地爆炸。

您建議的identical方法也不會比現有的==運算符增加任何值。

在我看來,覆蓋你的對象的方法equals它是有道理的(雖然我甚至質疑),但你絕對不會建議改變它的頂層和它的默認行爲的所有對象。

+0

評論者是正確的,相同()將意味着==。我們可以討論這種別名的用途,但問題是任何對象都會有一個相同的方法加上等於一個的默認相同的方法。這意味着新的Rectangle(1,2).equals(新的Rectangle(1,2))應該始終爲真,但新的Rectangle(1,2).identical(新的Rectangle(1,2))始終爲false。我的問題是,我認爲平等現在是用於平等的兩個意思,我總是有問題。 – Whimusical 2012-08-01 12:41:09

+0

將等價性的定義與平等或引用平等分開是有用的,這樣兩個事物是等價的*如果它們是相等的並且沒有辦法使它們發生突變而變得不平等*。如果Object支持對等式和等價的單獨測試,那麼集合也可以這樣做(如果兩個集合包含相同的項目,則它們是相等的;如果它們可以保證總是包含等效的項目,則它們是等價的)。 – supercat 2014-02-10 20:37:09