Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 忽略equals/hashCode中的某些字段时可能存在的陷阱?_Java_Equals_Hashcode - Fatal编程技术网

Java 忽略equals/hashCode中的某些字段时可能存在的陷阱?

Java 忽略equals/hashCode中的某些字段时可能存在的陷阱?,java,equals,hashcode,Java,Equals,Hashcode,如果只有一个对象的一些字段表示实际状态,我想在重写equals和hashCode时可以忽略这些字段 我对此有种不安的感觉,想问一下 这是惯例吗 这种方法是否存在潜在的缺陷 在忽略equals/hashCode中的某些字段时,是否有任何文档或指南 在我的特殊情况下,我正在探索一个问题的状态空间。我想保留一个访问状态的散列集,但我也在考虑包括通向该状态的路径。显然,两种状态是相等的,即使它们是通过不同的路径找到的。最终,“相等”意味着你想要它的意思。有一个限制,即“equal”值必须返回相同的哈希

如果只有一个对象的一些字段表示实际状态,我想在重写
equals
hashCode
时可以忽略这些字段

我对此有种不安的感觉,想问一下

  • 这是惯例吗
  • 这种方法是否存在潜在的缺陷
  • 在忽略
    equals
    /
    hashCode
    中的某些字段时,是否有任何文档或指南


  • 在我的特殊情况下,我正在探索一个问题的状态空间。我想保留一个访问状态的散列集,但我也在考虑包括通向该状态的路径。显然,两种状态是相等的,即使它们是通过不同的路径找到的。

    最终,“相等”意味着你想要它的意思。有一个限制,即“equal”值必须返回相同的哈希代码,当然,如果有两个相同的地址,“equals”必须返回true。但是,例如,您可以使用一个“equals”来比较两个网页的内容(忽略当前重复性的问题),并且,即使URL不同,也可以使用“equal”如果页面内容在某种程度上匹配。

    我见过的覆盖
    对象上的方法的最佳文档/指南是Josh Bloch的。它有一整章关于“所有对象通用的方法”,其中包括“重写equals时遵守一般约定”和“重写equals时始终重写hashCode”的章节。它详细描述了在重写这两种方法时应该考虑的事项。我不会直接给出答案;对于java开发者来说,这本书是绝对值得的。

    < P>这是基于你如何考虑给定对象的唯一性。如果它有一个主键(唯一键),那么仅使用该属性就足够了

    如果您认为唯一性是10个不同属性的组合,那么在equals中使用所有10个属性

    然后只使用equals中使用的属性来生成hashcode,因为相同的对象应该生成相同的hashcode

    为equals和hashcode选择属性是定义给定对象唯一性的方式

    • 这是惯例吗?对

    • 这种方法是否存在潜在的缺陷?没有

    • 在忽略equals/hashCode中的某些字段时,是否有任何文档或指南

      类对象的equals方法实现了最有区别的 对象上可能的等价关系


    这来自对象类Javadoc。但是作为这个类的作者,您知道唯一性是如何定义的。

    正如您所提到的,您的equals或hashCode()中没有包含“path”(路径)。我喜欢这个答案,但您多少避免了我的三个问题:-)