[英]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.