Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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方法与创建新方法_Java_Oop - Fatal编程技术网

Java 重写equals方法与创建新方法

Java 重写equals方法与创建新方法,java,oop,Java,Oop,我一直认为java中的.equals()方法应该被重写,使其特定于您创建的类。换句话说,寻找两个不同实例的等价性,而不是对同一实例的两个引用。然而,我遇到过其他程序员,他们似乎认为应该忽略默认对象行为,并创建一个新方法来测试同一类的两个对象的等效性 支持和反对重写equals方法的论点是什么?equals方法用于比较引用。因此,改变其行为不应凌驾于此 如果需要(或在某些.NET类中使用CompareTo方法),则应创建一个新方法来测试不同实例中的等效性。如果要在标准库类中测试等效性,则必须重写e

我一直认为java中的.equals()方法应该被重写,使其特定于您创建的类。换句话说,寻找两个不同实例的等价性,而不是对同一实例的两个引用。然而,我遇到过其他程序员,他们似乎认为应该忽略默认对象行为,并创建一个新方法来测试同一类的两个对象的等效性


支持和反对重写equals方法的论点是什么?

equals方法用于比较引用。因此,改变其行为不应凌驾于此


如果需要(或在某些.NET类中使用CompareTo方法),则应创建一个新方法来测试不同实例中的等效性。

如果要在标准库类中测试等效性,则必须重写equals方法(例如,确保java.util.Set包含唯一的元素或使用对象作为java.util.Map对象中的键)

注意,如果您覆盖equals,请确保遵守文档中所述的API合同。例如,确保您还覆盖:

如果两个对象根据 然后是equals(Object)方法 在每个 这两个对象必须产生相同的结果 整数结果

编辑:我没有将此作为关于该主题的完整答案发布,因此我将附和Fredrik Kalseth的声明,即覆盖等于最适合于。引用API:

注意:如果发生以下情况,必须非常小心 可变对象用作贴图关键点。 未指定映射的行为 如果对象的值已更改 以影响平等的方式 对象是键时的比较 在地图上


如果要在将对象添加到已排序数据结构(
SortedSet
等)时实现特定行为,则只需重写
equals()
方法

执行此操作时,还应覆盖
hashCode()


请参阅以获得完整的解释。

我强烈建议您选择一份有效Java,并按照第7项阅读。如果您要为可变对象重写equals,则需要小心,因为许多集合(如Maps和Set)都使用equals来确定等价性,并对集合中包含的对象进行变异对可能导致意想不到的结果。布赖恩·戈茨也有一个很好的回答。

你应该“永远不要”重写可变对象的equals&getHashCode-这适用于.net和Java。如果您这样做,并将此类对象用作f.ex a字典中的键,然后更改该对象,您将遇到麻烦,因为字典依赖hashcode来查找对象


这里有一篇关于这个主题的好文章:

老实说,在Java中没有反对重写equals的论点。如果您需要比较实例是否相等,那么这就是您要做的

如上所述,您需要了解hashCode的契约,同样,还要注意接口周围的陷阱——在几乎所有情况下,您都希望Comparable定义的自然顺序与equals一致(有关规范反例,请参阅api文档)

除了不使用现有的库类之外,创建一个确定相等性的新方法在某种程度上违背了Java惯例。

@David Schlosnagle提到了Josh Bloch的——这是任何Java开发人员必须阅读的

有一个相关的问题:对于不可变的值对象,您还应该考虑重写<代码> COMPAREIGO到。 通常情况下,但并非严格要求(比较(x,y)==0)=(x.equals(y))。一般来说,任何违反此条件的比较器都应明确指出这一事实。建议使用的语言是“注意:此比较器施加与等于不一致的顺序。”

关于Java.lang.Object方法的有效Java(Josh Bloch;第1版)一章: