Effective Java 3:对于所有对象都通用的方法

时间:2022-11-21 16:02:22

第三章:对于所有对象都通用的方法
第一条:覆盖equals方法请遵守通用的约定
在下面中可以不考虑覆盖equals方法:
(1).类的每个实例本质上是唯一的 枚举类型
(2).不关心类是否提供了逻辑相等,的测试功能
(3).超类已经覆盖了equals,从超类继承过来的行为对于子类也是适合的,
(4).类是是私有的或包含所有的,
实现equals方法要实现的等价关系:
自反性,对称性,传递性,一致性
里式替换原则(lis substitution principle),一个类的任何重要的属性也适用与他的子类型
复合优于继承
(5).非空性:所有的对象都不必须不等于null,
public boolean equals(Object o){
if (!(o instanceof MyType))
return false;
Mytype e=()o;
}
如果把null传给equals方法,类型就会返回false,所以不需要单独的null检查

实现高质量的equals方法诀窍:
(1).使用==操作符检查参数是否为这个对象的引用
这个是性能优化,如果equals操作非常昂贵就可以考虑这么做
(2).使用instanceof检查参数是否是正确的类型
(3).把参数转化为正确的类型
(4).对于该类中的每个关键域,检查参数中的域是否与该对象中对应的域相匹配
基本类型,引用类行,double,float比较注意,数组比较每一个,
比较域时,选择尽可能多的不一直的域,或者开销最低的域;不要去比较不属于对象逻辑做太的域
(5).注意当编写完equals时,应该问自己三个问题,是否对称,是否传递,一致
告诫:
(1)。覆盖equals重要覆盖hashcode()
(2)。不要企图让equals方法过于智能
(3)。不要将equals声明中的Object对象替换为其他的类型


第九条:覆盖equals时,总要覆盖hashCode()方法
因为:相等的对象必须要有相等的散列码
方法:计算散列码:方法---------:注意把冗余域排除,就是equals中没有用到的域,但是不要试图从散列码中排除任意一个对象的关键部分来提高性能,计算hashCode值时,注意添加优化,可以避免重复计算
第十条:始终覆盖toString()方法
toString()方法应该返回对象中包含的所有值关注的信息
第十一条:谨慎的覆盖clone方法
第十二条:考虑实现Comparable接口
一旦实现该接口可以和很多泛行算法算法结合使用
注意比较基本类型用<>,比较double float 用Float.compare double.compare,对于数组用到每一个元素