我一直认为应该重写java中的.equals()方法,使其特定于您创建的类.换句话说,寻找两个不同实例的等价而不是两个对同一实例的引用.但是我遇到过其他程序员,他们似乎认为应该保留默认对象行为并创建一个新方法来测试同一个类的两个对象的等价性.
支持和反对覆盖equals方法的理由是什么?
如果要在标准库类中测试等效性(例如,确保java.util.Set包含唯一元素或使用对象作为java.util.Map对象中的键),则必须覆盖equals方法.
请注意,如果您覆盖等于,请确保遵守文档中所述的API合同.例如,确保您还重写Object.hashCode:
如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果.
编辑:我没有发布这个关于这个主题的完整答案,所以我将回应Fredrik Kalseth的声明,即重写equals最适合不可变对象.引用Map的API :
注意:如果将可变对象用作映射键,则必须非常小心.如果在对象是地图中的键的情况下以影响等于比较的方式更改对象的值,则不指定映射的行为.
我强烈建议您阅读有效Java的副本,并阅读遵守平等合同的第 7项.如果要覆盖可变对象的equals,则需要小心,因为许多集合(如Maps和Sets)使用equals来确定等效性,并且变异集合中包含的对象可能会导致意外结果.Brian Goetz 对实现equals和hashCode也有很好的概述.