重写等式方法与创建新方法

2022-09-02 03:39:02

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

支持和反对覆盖等式方法的论据是什么?


答案 1

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

请注意,如果覆盖 equal,请确保遵守 API 协定,如文档中所述。例如,确保还覆盖 Object.hashCode

如果根据 equals(Object) 方法,两个对象相等,则对两个对象中的每个对象调用 hashCode 方法必须生成相同的整数结果。

编辑:我没有将此作为有关该主题的完整答案发布,因此我将响应Fredrik Kalseth的声明,即覆盖等于最适合不可变对象。要引用 Map 的 API::

注意:如果将可变对象用作映射键,则必须格外小心。如果对象的值的更改方式会影响相等比较,而对象是映射中的键,则不会指定映射的行为。


答案 2

我强烈建议拿起一份有效的Java副本,并通读第7项,遵守平等契约。如果要重写可变对象的等于值,则需要小心,因为许多集合(如“地图”和“集”)使用等于来确定等效性,并且更改集合中包含的对象可能会导致意外结果。Brian Goetz在实现 equals 和 hashCode 方面也有一个很好的概述。