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

满足下列四个条件之一的就不需要覆盖equals方法:
(1).类的每个实例本质上都是唯一的,如枚举等。
(2).不关心类是否提供了“逻辑相等”的测试功能。
(3).超类已经覆盖了equals方法,从超类集成过来的行为对于子类也是合适的。
(4).类是私有的或者包访问权限的,可以确定它的equals方法永远不会被调用。
当类具有自己特有的“逻辑相等”概念(不同于对象等同的概念),而且超类还没有覆盖equals方法以实现期望的行为时,就需要覆盖equals方法。在覆盖equals方法时,必须遵循自反性、对称型、传递性、一致性、非空性

违反对称性场景:equals传递的参数没有实现相同的equals方法,比较的仍然是引用地址,导致违反对称性
违反传递性场景:父类覆盖了equals,子类没有覆盖equals,调用了父类的equals方法,从而少比较了一些属性导致出错

实现高质量equals方法的诀窍:
(1).使用==操作符检查参数是否为这个对象的引用。
(2).使用instanceof操作符检查参数是否为正确的类型。
(3).把参数转换成正确的类型。
(4).对于要比较类中的每个关键域,检查参数中的域是否与该对象中对应的域相匹配。
(5).编写完equals方法后需要测试是否满足对称性、传递性和一致性。
覆盖equals方法时特别要注意:不要将equals生命中的Object对象替换为其他类型

9. 覆盖equals时总要覆盖hashCode方法

反正这两个就是要绑定在一起覆盖就对了

10. 建议任何时候都覆盖toString

覆盖toString提供可读性更好的信息

11.谨慎覆盖clone

继承Cloneable接口才可以使用Object当中的clone方法

如果你覆盖了非final类中的clone方法,则应该返回一个通过调用super.clone而得到的对象。

clone时确保不会伤害到原始对象(很多时候克隆的时候如果只克隆了引用地址,就会有问题)

综上:尽量避免去覆盖clone,需要拷贝对象采用深拷贝技术。

12. 考虑实现Comparable接口

JAVA类库中的值类都实现了该接口中的compareTo方法,可以进行比较。如果自己设计的类有内在排序关系,强烈建议实现该接口。