繁体   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