effective java读书笔记8:覆盖equals方法请遵守通用约定
2017-01-21 00:00
405 查看
摘要: 对于所有对象都通用的方法
解读:equals是Obejct提供的通用方法,作用是比较两个实例逻辑上值是否相等,在自己设计的类中要考虑是否需要复写equlas方法,以及遵守equals方法的规范约定。
什么情况下需要提供equals方法?
如果类具有自己特有的逻辑相等的该类(不是对象等同的概念),并且它的超类也没有复写equals方法实现你的期许比较逻辑,则需要提供equals方法。文中提到了一个概念:值类。类似于Date、Integer这种对象。也就是可以简单理解,如果是值类就要考虑提供equals方法。如:
如果上述类不提供equals方法,比较规则默认就是比较对象的引用(和==一样),一次只有提供了equals方法才能达到你想要的值比较。这里再补充一点:集合Set只能存放不同的元素,这个不同也是建立在equals不相等上,如果相等,则Set判定为相同的元素。
提供的equals方法需要遵守的约定。
1、自反性。就是说如果两个对象的引用是一样的(也即是==比较是相等的),则equals一定要相等。
2、对称性。比较的两个对象一定要是同一种类型!也就是说在比较的时候我们都会有instanceof的判断,如果不是同一实例则肯定不相等。
3、传递性。如果实例a和b相等,b和c相等,则a和c也相等。这一点书中花了大篇幅讲,此次阅读没有仔细研究这一块,后面再详细补充。
4、一致性。如果两个对象相等,则在两个对象没有修改的情况下,永远都是相等的。举一个极端的例子就是,如果一个网络连接的类,提供的equals比较的逻辑是看这两个是不是都连接到了同一个url上,如果因为网络原因,某个时刻连不上了而导致两者不想等了,这就是所谓的不满足一致性。
5、非空性。就是永远不等于null。
总结:关于equals方法所说的要满足上述约定,理解了就好了,没必要死磕,能写好一个规范的equals即可。
解读: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(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- 第八条——覆盖equals方法时需遵守的通用约定
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java 对于所用对象都通用的方法 8.覆盖equals时请遵守通用约定.txt
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java - 对于所有对象都通用的方法 - 覆盖 equals 时请遵守通用约定
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- 对于所有对象都通用的方法 - 覆盖equals时请遵守通用约定
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- java对象通用方法之覆盖equals时请遵守通用约定、覆盖equals时总要覆盖hashCode、始终要覆盖toString、考虑实现Comparable接口
- 覆盖equals方法时请遵守通用约定
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- 第8条 对于所有对象都通用的方法——覆盖equals时请遵守通用约定
- 覆盖equals时请遵守通用约定