您的位置:首页 > Web前端

effective java读书笔记8:覆盖equals方法请遵守通用约定

2017-01-21 00:00 405 查看
摘要: 对于所有对象都通用的方法

解读:equals是Obejct提供的通用方法,作用是比较两个实例逻辑上值是否相等,在自己设计的类中要考虑是否需要复写equlas方法,以及遵守equals方法的规范约定。

什么情况下需要提供equals方法?

如果类具有自己特有的逻辑相等的该类(不是对象等同的概念),并且它的超类也没有复写equals方法实现你的期许比较逻辑,则需要提供equals方法。文中提到了一个概念:值类。类似于Date、Integer这种对象。也就是可以简单理解,如果是值类就要考虑提供equals方法。如:

public class IntObject {

private int i ;

public IntObject(int i) {
super();
this.i = i;
}

@Override
public boolean equals(Object obj) {

if(obj instanceof IntObject){

IntObject p = (IntObject) obj;

if(this.i == p.i){

return true;
}

}
return false;
}

public static void main(String[] args) {
IntObject p1 = new IntObject(1);
IntObject p2 = new IntObject(1);

System.out.println(p1.equals(p2));
System.out.println(p1 == p2);
}

}

如果上述类不提供equals方法,比较规则默认就是比较对象的引用(和==一样),一次只有提供了equals方法才能达到你想要的值比较。这里再补充一点:集合Set只能存放不同的元素,这个不同也是建立在equals不相等上,如果相等,则Set判定为相同的元素。

提供的equals方法需要遵守的约定。

1、自反性。就是说如果两个对象的引用是一样的(也即是==比较是相等的),则equals一定要相等。

2、对称性。比较的两个对象一定要是同一种类型!也就是说在比较的时候我们都会有instanceof的判断,如果不是同一实例则肯定不相等。

3、传递性。如果实例a和b相等,b和c相等,则a和c也相等。这一点书中花了大篇幅讲,此次阅读没有仔细研究这一块,后面再详细补充。

4、一致性。如果两个对象相等,则在两个对象没有修改的情况下,永远都是相等的。举一个极端的例子就是,如果一个网络连接的类,提供的equals比较的逻辑是看这两个是不是都连接到了同一个url上,如果因为网络原因,某个时刻连不上了而导致两者不想等了,这就是所谓的不满足一致性。

5、非空性。就是永远不等于null。

总结:关于equals方法所说的要满足上述约定,理解了就好了,没必要死磕,能写好一个规范的equals即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Effective Java
相关文章推荐