8.覆盖equals时遵守通用约定

不该覆盖equals的情况(类的每个实例都只与它自己相等):

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

应该覆盖equals的场景:
类具有自己的”逻辑相等”的概念, 且超类没有覆盖equals以实现期望的行为, 这通常属于”值类”的情形, 例如Integer和Date, 程序员在利用equals进行比较值对象的引用时, 希望知道他们在逻辑上是否相等, 而不想了解它们是否指向同一个对象.

equals方法实现了等价关系:

  • 自反性, 对于任何非Null的引用值x, x.equals(x)必须返回true
  • 对称性, 对于任何非Null的引用值x和y, 当且仅当y.equals(x)返回true时, x.equals(y)必须返回true
  • 传递性, 对于任何非Null的引用值x, y和z, 如果x.equals(y)返回true, 并且y.equals(z)也返回true, 那么x.equals(z)也必须返回true
  • 一致性, 对于任何非Null的引用值x和y, 只要equals的比较操作在对象中所用的信息没有被修改, 多次调用x.quals(y)就会一致的返回true, 或者一致的返回false

9.覆盖equals时总要覆盖hashCode

10.始终要覆盖toString

11.谨慎的覆盖clone

简言之, 所有实现了Cloneable接口的类都应该用一个公有方法覆盖clone, 此共有方法首先调用super.clone, 然后修正任何需要修正的域

12.考虑实现Comparable接口