- 浏览: 59831 次
- 性别:
- 来自: 成都
文章分类
读书笔记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 859本篇将介绍下ApplicationCo ... -
Spring源码分析之IOC
2013-03-16 21:40 772先看两种方式在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 3275public class IpUtil { publ ... -
mongodb
2012-11-20 22:09 742mongodb文档, -
padingtoolbar 的扩张
2012-10-31 22:01 0在Ext的原有分页控件中,服务器端方法是根据传入的起始数据记录 ... -
extjs的一些组件
2012-10-17 22:34 722<script type="text/java ... -
extjs
2012-10-14 23:09 638extjs的一些文档 -
jquery ui
2012-09-11 22:54 748一个jquery ui 后台 -
重拾java之线程1
2012-09-10 00:17 964[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 841最近看了下effective java 有编程许多经验值得学 ... -
读书笔记effective java 之通用程序设计3
2012-03-15 22:21 899第五条 基本类型优先于装箱基本类型 java有一个类型系 ... -
读书笔记effective java 之通用程序设计2
2012-03-15 20:59 927第三条 了解和使用类库 ... -
effective java 之通用程序设计
2012-03-15 16:15 768第一条 将局部变量的作用域最小化 将局部变量的作用域最小 ... -
http与socket连接区别
2011-11-08 01:11 473相信不少初学手机联网 ... -
HashMap 一般遍历
2011-11-04 16:28 789Map map=new HashMap() Iterator ...
相关推荐
从给出的部分内容来看,读书笔记主要聚焦于以下几个知识点: 1. C++语言的联邦概念:C++是一个由多个次语言构成的语言联邦,这包括了C语言核心、面向对象的C++、模板C++以及标准模板库(STL)。这种理解对于深入...
- Item8:equals方法应与`==`操作符一致,同时对所有字段进行比较。注意,不要忘记比较类的`this`引用。 - Item9:当覆盖equals时,必须同时覆盖hashcode,以保持哈希表的行为一致性。 - Item10:toString方法应...
《Effective STL》是Scott Meyers的一本经典著作,旨在帮助读者深入理解并有效利用STL(Standard Template ...通过阅读“STL源码剖析笔记.doc”,我们可以进一步探索STL的具体实现细节,增强对STL底层工作的认识。
- 工厂方法:介绍工厂方法模式,作为创建对象的抽象接口,提供更大的灵活性。 - 可枚举类型(enum):推荐使用枚举代替常量类,因为枚举具有内置的单例特性且更安全。 2. **第4章 类和接口** - 抽象类与接口:...
《Effective STL》中文版附带的中文笔记,将帮助读者更轻松地理解书中复杂的概念和技术,通过实例和解释加深对STL的理解,提升C++编程能力。阅读此书,不仅能够掌握STL的使用技巧,还能培养出良好的编程习惯和思维...
C++是一种强大的、通用的编程语言,被广泛应用于系统软件、应用软件、游戏开发、设备驱动程序、嵌入式系统等各个领域。学习C++不仅可以提升编程能力,还能深入理解计算机底层工作原理。以下是一些关于C++学习的好...
java8集合源码有效的 Kotlin - 示例 免责声明:这个存储库包含我在阅读优秀书籍 Effective ...一种指定参数期望的通用方法。 懒惰的消息 聪明的演员 - 合同 检查块 - 一种指定状态期望的通用方法。 断言块 -
- C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。 - C++由Bjarne Stroustrup于1979年在贝尔实验室开始设计开发。 2. **安装与配置C++开发...
《Effective C++》、《More Effective C++》和《Exceptional C++》等书籍是学习C++的经典之作,它们涵盖了C++编程的最佳实践和常见陷阱。 #### 23. 学会使用工具 学会使用版本控制工具(如Git)、调试工具(如GDB)...
此外,阅读经典书籍如《C++ Primer》和《Effective Modern C++》,以及官方文档和高质量的开源项目,也是提升编程技能的重要途径。 综上所述,高质量的C++编程是一个综合考虑代码功能、可读性、可维护性和性能的...
- **建议**:同时参考《The C++ Programming Language》和《Inside The C++ Object Model》,这两本书对深入理解C++标准库和对象模型非常有用。 #### 3. 编译器选择 - 选择合适的编译器非常重要,如Visual C++、GCC...
- **建议**:阅读经典书籍如《Effective Object-Oriented Software Construction》、《Design Patterns》等,掌握常用的设计模式,并将其应用于实际项目中。 #### 33. 参加C++专项竞赛或认证考试 - **解释**:通过...
《Effective C++》、《More Effective C++》以及《Exceptional C++》都是经典之作,它们涵盖了大量关于如何写出高效、可维护代码的最佳实践。 ### 24. 学习并理解C++的内存管理机制 C++允许程序员直接操作内存,这...
3. **封装**:封装是面向对象的核心特性之一,它通过将数据和操作数据的方法结合在一起,隐藏实现细节,对外提供接口来实现数据的安全访问。 4. **继承**:继承允许一个类(子类)从另一个类(父类)继承属性和行为...
- **解析**:C++是一种支持多种编程范式的语言,其中面向对象编程是最为重要的特性之一。学习类(class)、模板(template)、STL标准库以及泛型编程等概念,对于编写高质量的C++代码非常关键。 #### 7. 平衡理论与实践...