2012-04-09 46 views
6

我有下面的代碼,它重寫equals()和hashcode()方法。getters可以在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(); 

我的意思,而不是使用特性可以直接我使用的吸氣劑的內部等於和哈希碼的方法呢?

謝謝!

+0

爲什麼不?:) – 2012-04-09 10:53:59

+0

是的,沒有任何問題。 – MJM 2012-04-09 10:59:41

+0

是的。當對象位於集合中時,您不能使用可以修改的setter或字段。 – 2012-04-09 11:02:04

回答

1

你可以,但你爲什麼?選項A:編譯器內聯,所以最終你最終會引用該字段。選項B:編譯器不會內聯該調用,即您已經引入了一個額外的方法調用。

還有可讀性的含義 - 如果name字段可以直接在類中訪問,爲什麼不直接引用它?我發現這更容易閱讀,但有些人認爲它不一致。

+0

作爲一個小記。如果你使用Mokito,並且模擬一個在equals中使用的getter,並且你的equals方法是final的,你將會進入無限循環地獄。 Mokito在內部使用平等來模擬你的領域。通常它會覆蓋你等於,但如果它被標記爲最終你會得到StackoverflowError – Lori 2016-02-19 08:43:15

3

相信你可以利用這一點,

hashcode()equals()是現場的方法,他們可以直接訪問私有成員,但如果有一些邏輯包裹在存取方法,所以它始終是安全的訪問字段使用訪問器方法

0

是的,爲什麼你不能?

未來,有了這樣的事情,我建議你只是試試看。

0

是的,你可以。爲什麼不?你有什麼疑問?

1

是的,我強烈建議在equals() & hashCode()執行中使用getters。據我所知,這不會以任何方式傷害你。

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

如:如果試圖通過比較你的潛在休眠DAO返回了兩個代理對象,你永遠不會從你的equals()方法獲得真正,即使它們是相同的對象。

更新

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

這是摘自Effective Java。請查詢this瞭解更多信息。

+0

我知道這是舊的問題來回答,但我相信這將有助於一個人與代理工作。 – Diablo 2016-11-09 15:02:04

相關問題