首页 > 代码库 > 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接口