读书笔记effective之对所有对象通用的方法

读书笔记effective之对所有对象通用的方法
 第一条 覆盖equals时遵守通用约定
覆盖equals方法似乎很简单,但是许多覆盖方式会导致错误,并且后果非常严重,如果满
足下面任何一个条件就是所期望的结果
类的每个实例本质上都是唯一的
不关心类是否提供了“逻辑相等”的测试功能
超类已经覆盖了equals,从超类继承过来的行为对于子类也是合适的
类是私有的的或是包机私有的,可以确定它的equals方法永远不会被调用

要覆盖equals 需要遵守的约定

自反性:对于任何非null的引用值x,x.equals(x)必须返回true
对称性:对于任何非null 引用值x和y,当且仅当y.equals(x)返回true,并且y.equals.
(x)也必须返回true.
传递性:对于任何非null的引用值x,y和z,如果x.equals(y)返回true,并且y.equals(z)
也返回true,那么x.equals(z)也必须返回true,

看一个简单的不可变得二维整数Point类

public  class Point{
private final int x;
private final int y;
this.x=x;
this.y=y;
}
public boolean equals(Object o){
if(!o instanceof Point){
return false;
Point p=(Point)o;
return p.x=x&&p.y==y;
}
}

假设你想要扩展这个类,为一个点添加颜色信息

 public  class ColorPoint extends{
private final Color color;
}
public ColorPoint(int x,int y,Color color){
super(x,y);
this.color=color;
}
public boolean equals(Object o){
if(!o instanceof ColorPoint){
return false;

return super.equals(o)&&((ColorPoint)o).color==color;
}
}

上面的实例在比较相反时可能得到不同的结果
     Point p=new Point(1,2);
ColorPoint cp=new ColorPoint(1,2,Color.RED) ;

p.equals(cp)返回true ,而cp.equals(p)返回false, 这主要是参数类型不正确,子
类和父类的equals的内部不一样。一种解法是父类为abstract 类型,子类添加新的组件,就
不会违背equasl约定。

一致性:对于非null的引用值x和y,只要equals的比较操作在对象中所用的信息没有被修
改,多次调用x.quals(y)就会一直返回true,或者一种地返回false
对于任何非null的引用值x,x.equals(null)必须返回null
实现equals方法的技巧

1 使用==操作符检查“参数是否为这个对象的引用”
2 使用instanceof操作符检查"参数是否为正确的类型"
3 把参数转换成正确类型
4 对于该类中的每个“关键”域,检查参数中的域是否与该对象中对应的域相配备

第二条 覆盖equals时总要覆盖hashCode

在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一队形调用多次,hashCode 方法都必须始终如一地返回同一整数。在同一个应用程序的多次执行过程中,每次执行所返回的整数可以不一致。
如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的结果
如果两个对象根据equals(Object)方法比较是不相等的,那么调用这两个对象中的任意一个对象的hashCode 方法,则不一定产生不同的整数结果。但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列函数的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值