覆盖equals时请遵守通用约定
概述
覆盖equals方法可能会导致严重的错误。
满足下列条件不覆盖equals
- 类的每个实例本质上是唯一的;
- 不关心类是否提供了“逻辑相等”的测试功能;
- 超类覆盖了equals,该方法对于子类也合适;
- 类是私有或者包级别私有的;
实现equals方法
当类具备自身特有的逻辑相等概念时,并且超类还没覆盖equals以实现期望方式时,我们应该重载equals;
在覆盖equals时,应该满足以下约定:
- 自反性:x.equals(x)为true;
- 对称性:x.equals(y)为true时,y.equals(x)也为true;
- 传递性:x.equals(y), y.equals(z)为true,x.equals(z)也为true;
- 一致性:如果两个对象相等,那么它们就必需始终保持相等,除非对象被修改了;
- 非空性:任何对象都不等于null;
实现高质量equals:
- 使用==操作符检查“参数是否为对象的引用”;
- 使用instanceof检查“参数是否为正确的类型”,类或者类实现的接口;
- 把参数转换成正确的类型,要使用instanceof测试;
- 对类中的关键域要,检查参数中的域是否与对应的域对应;