覆盖equals时请遵守通用约定

覆盖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:

  1. 使用==操作符检查“参数是否为对象的引用”;
  2. 使用instanceof检查“参数是否为正确的类型”,类或者类实现的接口;
  3. 把参数转换成正确的类型,要使用instanceof测试;
  4. 对类中的关键域要,检查参数中的域是否与对应的域对应;