2011-11-29 53 views
0

我有一個有幾個字段的類,其中一個是int,而2個是long。我在想什麼做的是增加在檢查中equals()因此如果Integer對象傳遞中,它會比較int領域,如果相同的回報true。同樣,如果傳入Long,如果它位於2個long字段之間,它將返回true。因此,如果我將這些對象中的幾個添加到ListSet,然後我可以執行get()並讓它自動爲我提供第一個匹配的對象。我的想法是,如果我這樣做,那麼我只需撥打電話get(),然後我就可以擁有它,而不必額外使用循環&檢查。爲不同的值類型添加支票.equals()

這是一個好主意還是壞主意相比,只是遍歷所有對象的和做的比較呀?

+1

請張貼一些代碼。 – djhaskin987

回答

5

不要這樣做。

equals()方法有a well-defined contract,並且您提出的實施違反了它。例如,它不會是對稱的;如果x是你的對象和yIntegery.equals(x)將是即使x.equals(y)是真的假的。打破這些規則會讓任何需要使用代碼—的人感到困惑,甚至在將來您更習慣於正確使用此方法時也是如此。

您的用例聽起來像他們可能會滿意NavigableMap,其中鍵是整數,值是您的類的實例。

+0

是的,當我把它放在一起的時候,我認爲這不是一個好主意/聰明的黑客,更是一個非常危險的主意。我仍然有興趣聽到大家對這個問題的看法。 – Drizzt321

+0

@ Drizzt321這很有道理。如果您想了解更多關於使用「NavigableMap」的信息,請告訴我。 – erickson

+0

謝謝埃裏克森,但我想我會堅持使用foreach或迭代器,它更適合可能的數據。 – Drizzt321

1

性能將是相同的,但代碼將被混淆。一個不同的開發者(或者你自己在幾個月內)只會預期equals()來檢查一個對象是否爲等於

我會去更明確的解決方案。

0

只有當對象的語義遵循相同的邏輯時纔有意義。

如果不同類型的代表不同的值,具有不同的含義,這種類型的過載產生的混淆。

它還聽起來像「等於」爲多頭甚至不是一個等號,這是雪上加霜。

封裝在對象中的行爲是好的,但應該理智地命名。

1

您的equals方法應該有一個具體的實現,而不依賴於傳遞的Object的類型,閱讀等量合同here,因爲任何人都讀取您的代碼或javadoc將期望它是根據合同。

對於這種情況,您可以編寫自己的自定義Comparator並使用它來搜索集合中的對象。

或者有獨立的等於方法,如checkIntEqualitycheckLongEquality,並根據需要調用它們。