簡體   English   中英

實現相同接口的類的 hashCode

[英]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(); }
}

我也遇到過類似的情況。 基本上,實現(我有兩個)看起來完全一樣。

如果我只使用了一個類,那么類名在其他地方使用時會造成混淆。 因此,我繼續使用兩個類來提高可讀性。

例如:鈎子所使用prepost的事情導致初始化創建兩個類PreInitPostInit 但是,當時的要求是在初始化前和初始化后做同樣的事情 但是,在不久的將來,這種情況會發生變化,每個人都會有不同的邏輯。

兩個不同的對象可以具有相同的哈希碼,這並沒有錯(只要您注意equals

請參閱: 具有相同哈希碼的兩個不相等的對象

給出相同hashCode()不同對象肯定是“好的”。 有時會發生沖突是哈希的本質 哈希碼將潛在的無限范圍映射到受限范圍。 碰撞是不可避免的。 尤其是在考慮不同類型的對象時, someAsomeB是否具有相同或不同的哈希碼真的沒有太大關系!

但除此之外,另一個答案是:您的問題暗示了設計問題。 您不應該問“兩個接口使用確切的哈希碼是否可以”。 你應該問:“為什么我最終得到兩個共享這么多共同點的類?!”

這里真正的問題是代碼質量:您復制了字段,並且可能是處理這些字段的代碼。 最有可能的是,“更好”的方法是重構兩個類,並將公共方面推入一個不同的類,然后讓您的兩個類使用該公共類!

是的,可以為不同的對象使用相同的哈希碼。
如您所知,哈希碼范圍受 java 中的int類型限制。 但對象的范圍不受限制。 不同對象具有相同哈希碼的情況稱為碰撞
為了避免與之相關的錯誤,您應該記住 hashcode 和 equals 之間的契約:
1) 如果兩個對象相等,則它們必須具有相同的哈希碼
2) 如果兩個對象具有相同的哈希碼,它們可能相等也可能不相等
你可以在這里找到更多關於它的信息

暫無
暫無

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

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