簡體   English   中英

我應該總是覆蓋 equals、hashcode 和 toString 方法嗎?

[英]Should I always override equals, hashcode and toString methods?

我有一個相當簡單的問題:根據最佳編程實踐,當我創建一個新的模型類時,我應該總是覆蓋 equals、hashcode 和 toString 方法嗎? 即使我不打算比較特定類的對象?

這些方法中的每一種都有其自身的意義。 equalshashCode方法用於比較和散列,而toString主要用於記錄目的。 如果您不想要任何這些功能,則不需要實現它們。

另一個最佳實踐是不要實現從未使用過的代碼。 所以主要是按需實現這些方法。 在不立即使用這些方法的情況下實現這些方法的一個原因是確保其他開發人員在按需實現時可能無法意識到的特定實現或行為。 所以對於您的問題:不,並非總是如此。

盡管上述答案是正確的,但我想補充一下為什么這些方法實際上被覆蓋了。 如果您的模型類將用作MapTreeSet 的鍵,則最佳實踐是覆蓋equalshashCode方法(因為比較 2 個模型類對象將需要它)。

如果您希望以有效的方式顯示模型類數據,則需要覆蓋toString 假設您有一個模型類Dummy ,它有 2 個字段field1field2

// Without overriding toString
System.out.println("field1: " + dummyObj.field1 + " field2"+dummyObj.field2);

// With overriding toString
System.out.println(dummyObj);

// Your overridden toString
public String toString(){
  return "field1: " + this.field1 + " field2"+this.field2;
}

按照my own perspective

你不應該總是覆蓋hashcodeequal但你應該覆蓋toString

why toString?

假設您有一個具有 10 個以上屬性的class ,並且您正在調試一個是否已填充的對象,

我寧願不檢查 getter 而是打印出一個對象會減少我的時間

hashcode and equal?

每當我們使用基於哈希的集合時,就會出現這兩種方法,例如:

(1) hashSet, (2) hashTable, (3) hashMap and few more

如果您不打算使用對象的收集和比較! 那么你只有無用的代碼,這會產生歧義

該決定應基於

  • 一致性(指南和代碼檢查器)
  • 質量
  • 代碼風格
  • 努力(寫作、閱讀和理解含義)

我自己比較松懈,感覺不是每個班級都需要那么多關注(為了將來可能使用)。

雖然應該堅忍地遵循指導方針。 代碼檢查器幾乎永遠不會被忽視。

由於 IDE 甚至庫提供了用於生成方法的輕松創建的鍋爐代碼,因此工作量很小,但代碼樣式可能會變得不必要地臃腫。 特別是對於內部類。

當然,“回調”事件處理類不需要它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM