Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.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,我知道这看起来像是一个被问了很多次的问题,所以让我更具体一点: 如果我将我的对象传递给第三方代码,它可能需要我的对象重写对象方法。除非第三方是开源的,否则无法确定 但我读到的大部分代码都缺少Those覆盖 我说的对吗?即使代码不直接需要一个正确的equals()或hashCode(),只要它将其对象传递给黑盒第三方,它仍然是有风险的 编辑:正如许多人指出的,在某些情况下,不重写是有意义的:基本上,当我们对父实现感到满意时(这包括对象默认实现,当我们的对象不是“数据”表示时,它往往是好的)。我们还

我知道这看起来像是一个被问了很多次的问题,所以让我更具体一点:

如果我将我的对象传递给第三方代码,它可能需要我的对象重写对象方法。除非第三方是开源的,否则无法确定

但我读到的大部分代码都缺少Those覆盖

我说的对吗?即使代码不直接需要一个正确的equals()或hashCode(),只要它将其对象传递给黑盒第三方,它仍然是有风险的

编辑:正如许多人指出的,在某些情况下,不重写是有意义的:基本上,当我们对父实现感到满意时(这包括对象默认实现,当我们的对象不是“数据”表示时,它往往是好的)。我们还知道,JDK中的一些方法需要Those重写


但是在我的例子中,如果我举一个最近的例子,我有一个POJO,它是JSON层次结构的对象表示。然后我将Those对象传递给第三方库以生成JSON(然后将其发送给一些REST ws)。什么告诉我这个第三方不需要对象方法覆盖?我认为一个好的API会指出何时需要将对象传递给它以覆盖hashCode()等,因为人们可能会监督这个问题。

当人们试图快速编写代码并编写东西时,这些通常会被忽略,而默认行为是(equals是引用相等,hashcode来自对象的地址iirc)然后接管。如果您没有将它们放入集合中(作为可比较或键),除非您在对象之间进行任何类型的比较,否则您都不需要,但很多情况下都依赖于equals和哈希代码。只要您想将元素(例如)放入
列表中,并执行类似
contains()
你需要它。这完全取决于你想对对象做什么。很多时候,你正在使用的库不需要比较对象,因为它们各自代表不同的东西,没有等价概念。如果每个实例都被认为与其他实例不同,那么就不需要这些方法.
只要您想将元素放入列表并执行类似contains()的操作,您就需要它。
否,完全取决于用例。有时需要引用相等。“除非第三方是开源的,否则无法确定。”如果它们有正确的文档记录,那么您可以通过阅读文档来了解。如果第三方库要求您的对象重写equals和hashCode,但文档没有这样说,则该库没有正确的文档记录。当人们试图快速编写代码并将其写入时,这些通常会被忽略,而默认行为(equals是引用相等,hashcode来自对象的地址iirc)然后接管。如果您没有将它们放入集合中(作为可比较或键),除非您在对象之间进行任何类型的比较,否则您都不需要,但很多情况下都依赖于equals和哈希代码。只要您想将元素(例如)放入
列表中,并执行类似
contains()
你需要它。这完全取决于你想对对象做什么。很多时候,你正在使用的库不需要比较对象,因为它们各自代表不同的东西,没有等价概念。如果每个实例都被认为与其他实例不同,那么就不需要这些方法.
只要您想将元素放入列表并执行类似contains()的操作,您就需要它。
否,完全取决于用例。有时需要引用相等。“除非第三方是开源的,否则无法确定。”如果它们有正确的文档记录,那么您可以通过阅读文档来了解。如果第三方库要求您的对象覆盖equals和hashCode,但文档没有这样说,那么该库没有正确的文档记录。