簡體   English   中英

為Double列表覆蓋equals()和hashCode()的問題

[英]Problem with overriding equals() and hashCode() for a List of Double

我的課如下:

public class Data{
   int x;
   ArrayList<Double> list;
}

現在,我想編寫單元測試並將該類與另一個類進行比較,以僅檢查是否相等。 但是,我想允許有一些錯誤的余地,以便即使Doubles在某些epsilon上接近的,它們也被認為是相等的。 現在,如果我重寫equals()方法,NetBeans和Sonar會提示我也重寫hashCode()方法,這沒有任何意義。 原因是,簡單地實現為CLOSE列表輸出相同的哈希碼值的hashCode()方法是不可行的。

我的問題是這樣的:

我是否應該繼續重寫equals()方法並僅重寫hashCode()以便通過聲納檢查? (hashCode()的虛擬實現)

要么

我應該只在單元測試中而不是在實際源代碼中實施這種方法來檢查緊密性嗎?

這看起來像XY問題。

正如您對OP的評論所指出的那樣,由於您的業務規則( “如果Doubles相對於某些epsilon是緊密的……” ),您陷入了與覆蓋equals()相關的非平凡的傳遞性問題。

實際上,您不可能為該規則有意義地實現equals()方法,因為傳遞性(“ 如果x.equals(y)返回true而y.equals(z)返回true,則x.equals(z)應該返回true ”)不能得到保證。 您可能有三個Data對象d1,d2和d3,其中d2與d1和d3相等(即足夠接近),但d1與d3不相等(即不夠接近)。

Java在進行相等性測試時所強加的規則沒有錯,並且確定Data實例的相等性的特定條件也沒有錯。 只是它們不兼容。

但是,盡管有很多規則,但 如果遵循 equals()路徑, 絕對應該遵循 ,但我在問題中看不到任何內容表明您必須重寫任何內容。 所以不要去那里。

為什么不只在Data類中創建一個新的方法public boolean sameAs(Object other) 它可以根據您的規則檢查是否相等,並且單元測試可以調用該方法。 然后,您完全沒有必要或義務實現equals()hashCode()

(於19/12/19更新,以闡明為什么equals()無法實現。)

暫無
暫無

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

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