2012-12-20 69 views
-1

我有一個java項目,我需要兩個身份比較(是2參考相同)和平等比較(兩個對象都包含相同的數據)。
我的解決方案是不覆蓋equals/hashcode,並將isEqual方法添加到我的對象。
有沒有更好的模式來處理這種情況?java:需要身份和同一時間

編輯:
這是關於此特定需求的更多信息。

默認情況下,我們有:

  • equals執行
  • containsequals方面中實現的身份檢查(==),因此使用==

但我使用我想要:

  • equals執行相等性檢查(對象包含相同的數據)
  • contains保持與==實施

我不能同時兼得,所以一個解決方案是實現我 自己的平等檢查並具有:

  • contains保持相同,用==
  • 實施isEqual,並用它來代替equals

另一種解決方案是實現我自己包含使用==:

  • 實施customContains使用==並使用它,而不是contains
  • 重載equals檢查對象是否包含相同的數據

哪個最好?有沒有更好的方法來做到這一點?

+0

你是什麼意思,這兩個引用是否相同? –

+0

overrite equals()並使用==和equals();)它真的取決於你想要使用它的方式。 – soulcheck

+0

爲什麼你不想完全重寫它們? – Woot4Moo

回答

3

做到這一點的最佳模式是遵循語言的規範。重寫equals和哈希碼,不要滾動你自己的等於,除非,這是一個很大的除非你外面沒有人會使用這個代碼它永遠不會改變。

如果你想把它們封裝在一個名爲isEqual的函數中,那就是hashcode和equals方法,這是另一種方法,但它仍然意味着你重寫equals和hashcode,你聲稱你不想做。

基本上,你正在做的是創建一個非常嚴格的和/或破壞的API,這將不會看到太多的用法,因爲它將很難使用,因爲你的isEqual函數可能是非確定性的。

+0

因此,最好使用==來覆蓋equals/hashcode並實現我自己的contains/indexOf,而不是保留原始的contains/indexOf並定製isEqual? – Pierre

+0

@Pierre我不遵循你的意思。索引與equals或hashCode無關。包含不需要被覆蓋(這是散列碼的用途)。你能澄清你的問題嗎? – Woot4Moo

+0

我編輯了更多信息的問題,感謝您的幫助到目前爲止。 – Pierre

7

重寫equals()方法以確定對象是否包含相同的數據。

使用==來確定它們是否是相同的對象,即相同的參考。

相關問題