8: 覆盖 equals 时请遵守通用规定

1.覆盖 equals 后,需要满足的条件

  • 1.类的每个实例本质上都是唯一的
  • 2.不关心是否提供了“逻辑相等”的测试功能
  • 3.超类已经覆盖了 equals,从超类继承过来d额行为对于子类也是合适的
  • 4.类是私有的或者包私有的,可以确定它的 equals 方法永远不会被调用

2.覆盖 equals 方法时要遵守的几个约定

  • 1.自反性

    对于任何非 null 的引用值 x,x.euqals(x) 必须返回 true,

  • 2.对称性

    对于任何非 null 的引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 必须返回 true。

  • 3.传递性

    对于任何非 null 的引用值 x、y 和 z,如果 x.equals(y) 返回 true,y.equals(z) 也返回 true, 那么 x.equals(z) 也必须返回 true。

  • 4.一致性

    对于任何非 null 的引用值 x 和 y,只要 equals 的比较操作在对象中多有的信息都没有被修改,多次调用 x.equals(y) 就会一致的返回 true 或者 false。

  • 5.非空性

    所有的对象都不能为 null,为了防止抛出空指针异常。

3.高效实现 equals 方法的诀窍

  • 1.使用 == 操作符检查“参数是否为这个对象的引用”

  • 2.使用 instanceof 操作符检查“参数是否为正确的类型“

  • 3.把参数转换为正确的类型(接2)

  • 4.对于该类中的每个”关键“域,检查参数中的域是否与该对象中对应的域相匹配

  • 5.编写完之后,检查是否是对称的,传递的,一致的

  • 6.覆盖 equals 时,总要覆盖 hashcode

  • 7.不要企图让 equals 方法过于智能

  • 8.不要将 equals 声明中的 Object 对象替换为其他的类型

results matching ""

    No results matching ""