一、覆盖equals时请遵守通用约定
1、满足下列任何一个条件时,不需要覆盖equals方法
a、类的每个实例本质上都是唯一的。此时就是Object中equals方法所表达的含义。
b、不关心类是否提供了“逻辑相等”的测试功能
c、超类中覆盖的equals方法,使用于子类,不需要自己再覆盖了。
d、类是私有或者包级私有,并确定equals方法永远不会被调用,可以不覆盖。或者覆盖equals方法,内容为抛出异常。
2、高质量equals方法的诀窍:
a、使用==操作符检测“参数是否为这个对象的引用”。
b、使用instanceof操作符检查“参数是否为正确的类型”。
c、把参数转换成正确的类型。
d、对于该类中每个关键域,检测是否对应相等于参数中过的关键域。
不是float和double的基本类型域:直接使用==
引用域:递归调用equals方法
float域:Float.compare方法
double域:Double.compare方法
e、完成了equeal方法后,问自己三个问题:是否对称、传递和一致?
3、一些告诫
1、覆盖了equals方法后,一定要覆盖hashCode方法
2、不要企图让equals方法过于智能
3、不要将equals声明中的Object对象替换为其他类型
4、注意使用@Override注解来确保覆盖
二、覆盖equals方法时,总要覆盖hashCode方法
三、始终要覆盖toString方法
四、谨慎地覆盖clone方法
1、Cloneable接口并没有包含任何方法,它决定了Object中受保护的clone方法实现的行为:如果一个类实现了Cloneable,Object的clone方法就返回该对象的逐域拷贝,或者抛出CloneNotSupportedException异常。
2、所有实现了Cloneable接口的类都应该用一个公有的方法覆盖clone,此公有方法首先调用super.clone,然后修正任何需要修正的域。
3、提供对象拷贝的好办法是提供一个拷贝构造器或拷贝工厂。
五、考虑实现Comparable接口