对于所有对象都通用的方法
2016-09-11 23:15
260 查看
第八条:覆盖equals时请遵守通用约定
Object的equals()的规范【JAVASE6】:自反性。对于任何非null的引用值x,x.equals(x)必须返回true。
对称性,对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true。
传递性。x,y,z,如果x.equals(y)为true,y.equals(z)为true,那么x.equals(z)必须为true
一致性。引用值x和y,未修改,多次调用x.equals(y),结果必须一致
对于任何非null的引用值x,x.equals(null)必须返回false.
实现高质量equals方法的诀窍:
使用==操作符检查“参数是否为这个对象的引用”
使用instanceof操作符检查“参数是否为正确的类型”
把参数转换成正确的类型
对于该类中的每个”关键”域,检查参数中的域是否与该对象中对应的域相匹配
当你编写完成了equals方法之后,应该问自己三个问题:它是否是对称的、传递的、一致的
覆盖equals时总要覆盖hashCode()
不要企图让equals方法过于智能
不要将equals声明中的Object对象替换为其他的类型
第九条:覆盖equals时总要覆盖hashCode
因没有覆盖hashCode而违反的关键约定是第二条:相等的对象必须具有相等的散列码(hash code)。不要试图从散列码计算中排除掉一个对象的关键部分提高性能。虽然这样得到的散列函数运行起来可能更快,但是他的效果不见得会好,可能导致散列表慢到根本无法使用。
public class PhoneNumber{ private int a; private int b; private vlatile int hashCode;//缓存hashcode public int hashCode(){ int result=hashCode; if(result==0){ reuslt=17; result=31*result+a; result=31*result+b; hashCode=result; } return result; } }
第十条:始终要覆盖toString
在实际应用中,toString方法应该返回对象中包含的所有值得关注的信息。无论你是否决定指定格式,都应该在文档中明确地表明你的意图。
第十一条:谨慎地覆盖clone
如果你覆盖了非final类中的clone方法,则应该返回一个通过调用super.clone而得到的对象。实际上,对于实现了Cloneable的类,我们总是期望它也提供一个功能适当的公有的clone()方法。
clone方法就是另一个构造器;你必须确保它不会伤害到原始的对象,并确保正确地创建被克隆对象中的约束条件。
最好提供某些其他的途径来代替对象拷贝,或者干脆不提供这样的功能5.
另一个实现对象拷贝的好方法是提供一个拷贝构造器
第十二条:考虑实现Comparable接口
相关文章推荐
- effective java-读书笔记-第三章 对于所有对象都通用的方法
- Effective Java学习笔记-对于所有对象都通用的方法
- 10. 【对于所有对象都通用的方法】尽量覆盖toString方法
- Effective Java 03 对于所有对象都通用的方法
- 《Effective Java》第3章 对于所有对象都通用的方法
- 第3章 对于所有对象都通用的方法
- Effective Java:对于所有对象都通用的方法
- Effective Java2读书笔记-对于所有对象都通用的方法(一)
- 《Effective Java》—— 对于所有对象都通用的方法
- 第12条 对于所有对象都通用的方法——考虑实现Comparable接口
- Effective Java读书笔记(第3章-对于所有对象都通用的方法)
- effective java(对于所有对象都通用的方法)
- Effective Java学习笔记(二)对于所有对象都通用的方法
- Effective Java(二) 对于所有对象都通用的方法
- Effective Java2读书笔记-对于所有对象都通用的方法(二)
- Effective Java Note(对于所有对象都通用的方法)
- Effective Java:对于所有的对象都通用的方法
- 《Effective java》学习笔记 2 之 对于所有对象都通用的方法
- 第8条 对于所有对象都通用的方法——覆盖equals时请遵守通用约定
- Java中对于所有对象都通用的方法之——equals