gpt4 book ai didi

java - 对于 Double 列表重写 equals() 和 hashCode() 的问题

转载 作者:行者123 更新时间:2023-11-30 01:46:08 25 4
gpt4 key购买 nike

我有一个类(class)如下:

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

现在,我想编写单元测试并将此类与另一个类进行比较,以检查是否相等。然而,我想允许一些错误的余地,这样即使 double 相对于某个 epsilon 接近,它们也被认为是相等的。现在,如果我重写 equals() 方法,NetBeans 和 Sonar 也会提示我重写 hashCode() 方法,这没有任何意义。原因是简单地实现一个为 CLOSE 列表输出相同哈希码值的 hashCode() 方法是不可行的。

我的问题是这样的:

为了通过 Sonar 检查,我应该继续重写 equals() 方法并重写 hashCode() 吗? (hashCode() 的虚拟实现)

或者

我是否应该实现此方法来检查单元测试中的紧密度,而不是实际源代码中的紧密度?

最佳答案

这看起来像是一个 XY 问题。

由于您的业务规则,您陷入了与重写 equals() 相关的重要传递性问题(“如果 double 相对于某个 epsilon 很接近...” ),正如OP评论中所指出的。

事实上,您不可能为该规则有意义地实现 equals() 方法,因为传递性(“if x.equals(y) 返回 true 并且 y.equals( z) 返回 true,那么 x.equals(z) 应该返回 true") 无法保证。您可能有三个 Data 对象:d1、d2 和 d3,其中 d2 等于(即足够接近)d1 和 d3,但 d1 不等于(即不够接近)d3。

Java 在测试相等性时所施加的规则没有任何问题,并且确定 Data 实例相等性的特定条件也没有任何问题。只是它们不兼容。

但是同时there are a bunch of rules you should definitely follow 如果您沿着equals()路径走下去,我在您的问题中没有看到任何表明您必须覆盖任何内容的内容。所以不要去那里。

为什么不在 Data 类中创建一个新方法 public boolean sameAs(Object other) 呢?它可以根据您的规则检查相等性,并且您的单元测试可以调用该方法。那么您根本没有必要也没有义务实现 equals()hashCode()

(于 2019 年 9 月 12 日更新,以阐明为什么 equals() 无法实现。)

关于java - 对于 Double 列表重写 equals() 和 hashCode() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57898228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com