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

来源:互联网 发布:域名投资的秘密电子书 编辑:程序博客网 时间:2024/06/05 16:04

第八条:覆盖equals时请遵守通用约定

Object的equals()的规范【JAVASE6】:

  1. 自反性。对于任何非null的引用值x,x.equals(x)必须返回true。
  2. 对称性,对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true。
  3. 传递性。x,y,z,如果x.equals(y)为true,y.equals(z)为true,那么x.equals(z)必须为true
  4. 一致性。引用值x和y,未修改,多次调用x.equals(y),结果必须一致
  5. 对于任何非null的引用值x,x.equals(null)必须返回false.

实现高质量equals方法的诀窍:

  1. 使用==操作符检查“参数是否为这个对象的引用”
  2. 使用instanceof操作符检查“参数是否为正确的类型”
  3. 把参数转换成正确的类型
  4. 对于该类中的每个”关键”域,检查参数中的域是否与该对象中对应的域相匹配
  5. 当你编写完成了equals方法之后,应该问自己三个问题:它是否是对称的、传递的、一致的
  6. 覆盖equals时总要覆盖hashCode()
  7. 不要企图让equals方法过于智能
  8. 不要将equals声明中的Object对象替换为其他的类型

第九条:覆盖equals时总要覆盖hashCode

  1. 因没有覆盖hashCode而违反的关键约定是第二条:相等的对象必须具有相等的散列码(hash code)。
  2. 不要试图从散列码计算中排除掉一个对象的关键部分提高性能。虽然这样得到的散列函数运行起来可能更快,但是他的效果不见得会好,可能导致散列表慢到根本无法使用。
 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

  1. 在实际应用中,toString方法应该返回对象中包含的所有值得关注的信息。
  2. 无论你是否决定指定格式,都应该在文档中明确地表明你的意图。

第十一条:谨慎地覆盖clone

  1. 如果你覆盖了非final类中的clone方法,则应该返回一个通过调用super.clone而得到的对象。
  2. 实际上,对于实现了Cloneable的类,我们总是期望它也提供一个功能适当的公有的clone()方法。
  3. clone方法就是另一个构造器;你必须确保它不会伤害到原始的对象,并确保正确地创建被克隆对象中的约束条件。
  4. 最好提供某些其他的途径来代替对象拷贝,或者干脆不提供这样的功能5.
  5. 另一个实现对象拷贝的好方法是提供一个拷贝构造器

第十二条:考虑实现Comparable接口

0 0