簡體   English   中英

getter 可以用在 equals 和 hashcode 中嗎?

[英]can getters be used in equals and hashcode?

我有下面的代碼覆蓋 equals() 和 hashcode() 方法。

public boolean equals(Object obj)
 {
   if (obj == null)
     return false;
   if (!(obj instanceof Name))
     return false;
   Name name = (Name) obj;
   return this.name.equals(name.name);
 }

 public int hashCode()
 {
   return name.hashCode();
 }

我可以在這里替換以下 2 行:

return this.name.equals(name.name);
return name.hashCode();

return this.getName().equals(name.getName());
return getName().hashCode();

我的意思是我可以直接在 equals 和 hashcode 方法中使用 getter 而不是使用屬性嗎?

謝謝!

的,你可以使用這個,

hashcode()equals()是字段方法,它們可以直接訪問私有成員,但是如果訪問方法中包含一些邏輯怎么辦,那么使用訪問方法訪問字段總是安全的

是的,我強烈建議在equals() & hashCode()實現中使用 getter。 據我所知,這不會以任何方式傷害您。

當您比較兩個代理對象時,沒有 getter 的equals()實現將無法為您提供正確的結果。

例如:如果您嘗試比較底層 hibernate dao 返回的兩個代理對象,您將永遠不會從equals()方法收到true ,即使它們是相同的對象。

更新

使用 getter 方法而不是直接訪問。 這是因為作為 other 傳遞的 object 實例可能是代理 object,而不是實際實例。 要初始化此代理,您需要使用 getter 方法訪問它。

檢查以獲取更多信息。

你可以,但你為什么要這樣做? 選項 A:編譯器將其內聯,因此無論如何您最終都會得到對該字段的引用。 選項 B:編譯器不內聯調用,即您引入了一個額外的方法調用。

易讀性也有影響——如果在 class 中可以直接訪問name字段,為什么不直接引用它呢? 我發現這更容易閱讀,但有些人發現它不一致。

是的,你為什么不能?

以后遇到這樣的事情,還是建議大家試試看。

是的你可以。 為什么不? 你有什么疑問?

不。

hashCode()中使用的字段應該是final值類型。 如果不是,實例的 hash 在添加到 map 或 set 后可能會發生變化,這將導致運行時錯誤,例如Map無法找到您剛剛放入其中的實例。

由於equals()的行為必須與hashCode()相同,因此此要求也會泄漏到equals()中。 由於字段是final的,子類不應該覆蓋 getter,因此它們也應該是final的。

當 getter 是final時,沒有必要在equals() / hashCode()中使用它:輸入更多的字符,讀取更多的代碼,使編譯變慢(編譯器必須考慮內聯它),可能會使執行變慢.

有關 equals()/hashCode() 的許多陷阱的更多信息,請參閱優秀的EqualsVerifier

暫無
暫無

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

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