[英]hashCode for classes implementing the same interface
我有(至少)兩個實現相同接口並具有相同字段的類。 如果這兩個類的字段相同或者它們應該不同,那么如果這兩個類具有相同的哈希碼,是否可以? 這段代碼好嗎?
interface Base { }
class A implements Base {
private Integer value;
public A(Integer value) { this.value = value; }
public int hashCode() { return value.hashCode(); }
}
class B implements Base {
private Integer value;
public B(Integer value) { this.value = value; }
public int hashCode() { return value.hashCode(); }
}
我也遇到過類似的情況。 基本上,實現(我有兩個)看起來完全一樣。
如果我只使用了一個類,那么類名在其他地方使用時會造成混淆。 因此,我繼續使用兩個類來提高可讀性。
例如:鈎子所使用pre
和post
的事情導致初始化創建兩個類PreInit
和PostInit
。 但是,當時的要求是在初始化前和初始化后做同樣的事情。 但是,在不久的將來,這種情況會發生變化,每個人都會有不同的邏輯。
兩個不同的對象可以具有相同的哈希碼,這並沒有錯(只要您注意equals
)
請參閱: 具有相同哈希碼的兩個不相等的對象
給出相同hashCode()
不同對象肯定是“好的”。 有時會發生沖突是哈希的本質。 哈希碼將潛在的無限范圍映射到受限范圍。 碰撞是不可避免的。 尤其是在考慮不同類型的對象時, someA
和someB
是否具有相同或不同的哈希碼真的沒有太大關系!
但除此之外,另一個答案是:您的問題暗示了設計問題。 您不應該問“兩個接口使用確切的哈希碼是否可以”。 你應該問:“為什么我最終得到兩個共享這么多共同點的類?!”
這里真正的問題是代碼質量:您復制了字段,並且可能是處理這些字段的代碼。 最有可能的是,“更好”的方法是重構兩個類,並將公共方面推入一個不同的類,然后讓您的兩個類使用該公共類!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.