2013-04-10 66 views

回答

7

除非您需要equalshashCode的不同實施方案,否則不要覆蓋它們。如JavaDoc,Object版本中所述...

...實現對物體上最可能的等價關係;即,對於任何非null參考值xy,此方法返回true當且僅當xy指代相同的對象(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
  • 測試對象是否存在一個集合中

基本上,如果你的對象有值語義,作爲以某種方式「數據」,而不是單身,那麼你可能會由於以上一個或多個原因,最終必須覆蓋等於。