您的位置:首页 > 其它

对于所有对象都通用的方法

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接口

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: