首页 > 代码库 > Effective Java读书笔记(3对于所有对象都通用的方法)
Effective Java读书笔记(3对于所有对象都通用的方法)
3.1 覆盖equals时请遵守通用约定
什么时候应该覆盖Object.equals()方法呢?
如果类具有自己特有的“逻辑相等”概念(不同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为,这时我们就需要覆盖equals方法。
Object.equals()方法具有自反性、对称性、传递性、一致性和与null比较返回false的特点。
实现高质量equals方法的诀窍:
(1)使用==操作符检查“参数是否为这个对象的引用”。如果是,则返回true,这是一种性能优化,如果比较操作有可能很昂贵,就值得这么做。
(2)使用instanceof操作符检查“参数是否为正确的类型”。如果不是,则返回false。
(3)把参数转换成正确的类型。因为转换之前进行instanceof测试,所以确保会成功。
(4)对于该类中的每个“关键”域,检查参数中的域是否与该对象中对应的域相匹配。如果这些测试全部成功,则返回true,否则返回false。
(5)当你编写完成了equals方法之后,应该问自己三个问题:它是否是对称的、传递的、一致的?最好能编写单元测试来来检验这些特性。
注意:
a)覆盖equals方法时总要覆盖hashCode方法
b)不要企图让equals方法过于智能
c)不要将equals声明中的Object对象替换成其它的类型
3.2 覆盖equlas方法时总要覆盖hashCode
如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的结合一起正常运作,这样的集合包括HashMap、HashSet和HashTable。
3.3 始终要覆盖toString
toString的约定指出“建议所有的子类都覆盖这个方法”
3.4 谨慎的覆盖clone
Cloneable接口的目的是作为对象的一个mixin接口,表明这样的对象允许克隆。
3.5 考虑实现Comparable接口