對於編程項目我們製作了大約二十個我們需要的類。儘管我們沒有使用Object的equals()
和hashcode()
函數,是不是很好的編程習慣?我們認爲未來我們需要它們可能會很好,但我們不確定。重寫對象方法不錯的編程習慣?
0
A
回答
7
除非您需要equals
和hashCode
的不同實施方案,否則不要覆蓋它們。如JavaDoc,Object
版本中所述...
...實現對物體上最可能的等價關係;即,對於任何非
null
參考值x
和y
,此方法返回true
當且僅當x
和y
指代相同的對象(x == y
具有值true
)。
如果您需要equals
不同的含義你只覆蓋它們(如,說,String
一樣)。 (如果您覆蓋其中一個,則幾乎總是需要覆蓋另一個。)
1
我會毫不猶豫地重寫一些方法,只是因爲你「可能」需要它們。讓需要出現,然後解決問題。提供了這些方法的默認實現,並且可以與集合一起使用,添加您自己的實現可能會產生問題。
2
不是。只有當你需要它們時纔去做。
1
即使不直接調用它,某些方法也會使用equals
。
只有當您需要時,您才應該這樣做。 (如果Object.equals()
和Object.hashcode()
沒有做什麼需要爲您的類)
1
你應該重寫equals()
和hashCode()
當你需要和你應該總是覆蓋toString()
0
不要忽略它,除非你真的需要它。當您嘗試將這些對象用作HashMap
的密鑰時,您確實需要重寫這些方法。
2
編碼一些你知道你不需要的東西沒有意義。
OTOH,equals和hashCode對覆蓋非常有用,您可以很容易地使用它們而不會意識到,例如,
- 把物體在
HashMap
- 測試相等間接例如與單元測試
assertEquals
- 測試對象是否存在一個集合中
基本上,如果你的對象有值語義,作爲以某種方式「數據」,而不是單身,那麼你可能會由於以上一個或多個原因,最終必須覆蓋等於。
相關問題
- 1. 習慣的方法
- 2. 習慣的方法
- 3. 編程習慣:鑄字陣反對
- 4. 好習慣?虛擬對象
- 5. 這是不好的編程習慣
- 6. 這是不好的編程習慣嗎?
- 7. Java - 這是不錯的編程習慣嗎?
- 8. 引用對象的好習慣
- 9. 糟糕的編程習慣使方法依賴於另一種方法?
- 10. 在Haskell中編寫firstRightOrLefts的習慣用法?
- 11. 良好的編碼習慣
- 12. 錯誤:類不是抽象的,不重寫抽象方法
- 13. 調用存取方法的好習慣?
- 14. PHP OOP訪問方法的好習慣?
- 15. 習慣的方法反應,終極版
- 16. 保護方法的好習慣
- 17. 這是不好的編碼習慣嗎?
- 18. 是PHP返回錯誤對象的壞習慣嗎?
- 19. AsyncTask裏面的靜態方法 - 良好的編碼習慣?
- 20. 用於在類中生成新對象的習慣用法
- 21. 命名與該方法的返回類型相同的方法是不好的編程習慣嗎?
- 22. 良好的編程習慣與臨時編程的速度
- 23. 組合的動態編程習慣用法
- 24. 這是避免不斷創建對象的好習慣嗎?
- 25. 多線程的好習慣
- 26. 抽象方法重寫抽象方法
- 27. 在函數體內的typedef是不好的編程習慣嗎?
- 28. javascript:禁用重寫對象方法
- 29. Java的抽象方法不重寫
- 30. JavaScript對象的大小寫慣例