[读书笔记]Effective Java 第三章

覆盖equals方法时请遵守通用约定
这种说法的大意是要说明,Object类中定义的很多默认准则是被许多工具类或是第三方框架共同遵守的标准,一旦改动这样的标准机制,会在后续的使用中产生不稳定因素。equals方法常见用来做以下用途时,不建议对equals方法进行覆盖:
1.判断实例的唯一性
2.提供某种程度的逻辑相等
equals方法满足自反性,对称性,传递性,一致性,非空性。当需要覆盖equals方法时,需要注意以下三点:
1.覆盖equals时总要覆盖hashCode
2.不要企图让equals方法过于智能
3.不要将equals声明中的Object对象替换为其他的类型
 
覆盖equals方法时总要覆盖hashCode
在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。如果不这样做,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,例如HashMap,HashSet和Hashtable。
 
始终要覆盖toString
此项大多是为了打印数据时提供必要的关键信息,因为默认的toString方法只会返回类名+@+散列码的无符号十六进制表示。
 
谨慎地覆盖clone
cloneable接口的目的表示作为对象允许被克隆(clone)。如果一个类实现了Cloneable,Object的clone方法就返回该对象的逐域拷贝。如果你覆盖了非final类中的clone方法,则应该返回一个通过调用super.clone而得到的对象。如果类的所有超类都遵守这条规则,那么调用super.clone最终会调用Object的clone方法。从而创建出正确的实例。如果你决定用线程安全的类实现clone方法,要记得它的clone方法必须得到很好的同步。简而言之,所有实现了Cloneable接口的类都应该用一个公有的方法覆盖clone。此公有方法首先调用super.clone,然后修正任何需要修正的域。
 
考虑实现Comparable接口
类实现了Comparable接口,就表明它的实例具有内在的排序关系。
posted @ 2016-04-02 12:09  Gosling1021  阅读(223)  评论(0编辑  收藏  举报