- 浏览: 57713 次
- 性别:
- 来自: 成都
文章分类
读书笔记effective之对所有对象通用的方法
- 博客分类:
- java
读书笔记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类
假设你想要扩展这个类,为一个点添加颜色信息
上面的实例在比较相反时可能得到不同的结果
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 方法,则不一定产生不同的整数结果。但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列函数的性能。
第一条 覆盖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 方法,则不一定产生不同的整数结果。但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列函数的性能。
发表评论
-
Spring源码分析之IOC2
2013-03-16 23:25 776本篇将介绍下ApplicationCo ... -
Spring源码分析之IOC
2013-03-16 21:40 732先看两种方式在IOC容器取得bean 1 beanFactor ... -
一些在工作中遇到的问题汇总
2012-12-10 23:31 0保留一定的小数位数 1 DecimalFormat ... -
Set集合源码初探
2012-12-06 23:07 0[color=green][size=medium] ... -
一些常用的jar包
2012-12-04 22:44 0一些常用的jar 放在网上方便使用 Did your c ... -
java 获取请求ip
2012-11-20 23:11 3241public class IpUtil { publ ... -
mongodb
2012-11-20 22:09 683mongodb文档, -
padingtoolbar 的扩张
2012-10-31 22:01 0在Ext的原有分页控件中,服务器端方法是根据传入的起始数据记录 ... -
extjs的一些组件
2012-10-17 22:34 665<script type="text/java ... -
extjs
2012-10-14 23:09 609extjs的一些文档 -
jquery ui
2012-09-11 22:54 697一个jquery ui 后台 -
重拾java之线程1
2012-09-10 00:17 904[size=medium] 接触java也有一段时间了,以前选 ... -
dom4j 一些使用
2012-07-30 22:40 0dom4j使用 -
一个http请求
2012-07-18 00:04 0ackage com.sxit.phoenix.common; ... -
读书笔记effective java 之条目
2012-03-18 15:05 817最近看了下effective java 有编程许多经验值得学 ... -
读书笔记effective java 之通用程序设计3
2012-03-15 22:21 846第五条 基本类型优先于装箱基本类型 java有一个类型系 ... -
读书笔记effective java 之通用程序设计2
2012-03-15 20:59 891第三条 了解和使用类库 ... -
effective java 之通用程序设计
2012-03-15 16:15 741第一条 将局部变量的作用域最小化 将局部变量的作用域最小 ... -
http与socket连接区别
2011-11-08 01:11 443相信不少初学手机联网 ... -
HashMap 一般遍历
2011-11-04 16:28 757Map map=new HashMap() Iterator ...
相关推荐
effective c++读书笔记和总结 effective c++读书笔记和总结
Finix的精版Effective STL读书笔记
effective java 读书笔记,第二版自己摘要并翻译,以备速查。
effective C++读书笔记,effective C++读书笔记,effective C++读书笔记
Effective Java读书笔记.pdf
深度探索C++对象模型读书笔记
记录了我的effective-Python学习笔记,精简了effective-Python中重要的部分。effective-Python是一本值得多看几遍的书,但是看后面的几遍的时候完全可以直接看自己的学习笔记。此学习笔记侧重与比较实用的部分即前四...
《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷...此文档是该书的读书笔记。
effective C++ 很好 很不错 最好的C++进阶资料
USB读书笔记 USB读书笔记 USB读书笔记 USB读书笔记
Effective C#中文版 改善C#程序的50种方法 读书笔记.doc
Effective-Java读书笔记,别人分享的
摘录了《Effective C++》 (Scott Meyers 著)中有参考价值的编写代码建议,方面阅读
法学方法论读书笔记.pdf
关于Effective STL的读后感,还有一些此间想得东西和解决的问题
Effective_C++_3rd 读书笔记 pdf
《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》...
毕业论文读书笔记格式,教会你怎么写毕业论文读书笔记格式
读书笔记读书笔记读书笔记
2021年EFFECTIVEJAVA读书笔记.docx