`
schumee
  • 浏览: 24604 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Effective Java 学习笔记第7条 --- 在改写equals方法时请遵守通用约定

阅读更多

下列情况是不需要改写equals方法的:

  1. 同一个类的不同实例本质上是唯一的,就是个实例都有自己的本体(Identify)。
  2. 不关心该类是否提供了逻辑相等的功能。
  3. 父类已经改写过equals方法,对于子类来说,继承过来的equals方法已经是最合适的了。
  4. 一个类是私有的或者是包可见的,且确定它的equals方法不会被调用。

对于需要改写equals方法的时候,应该遵守如下约定:

  1. 自反性,即x.equals(x)为true.
  2. 对称性,即当且仅当x.equals(y)为true时y.equals(x)也一定为true。
  3. 传递性,即对任意的x,y,z,如果x.equals(y)为true,并且y.equals(z)也为true,那么x.equals(z)也必须为true。
  4. 一致性,即对于任意的x,y,如果x,y都没有被修改的话,那么多次调用x.equals(y)要么一致地返回ture,要么一致地返回false.
  5. 对于非空的引用x,x.equals(null)一定要返回false.

改写equals方法时的建议:

  1. 用==操作符检查实参是否为指向对象的同一个引用。
  2. 使用instanceOf检查实参是否是正确的类型。
  3. 在2的基础上,把实参转换成正确的类型。
  4. 检查实参的域与当前对象的域值是否相等。
  5. 编写完equals方法后,检查是否满足等价关系。

例如:

public boolean equals(Object o)
{
       if(o== this) return true;
       if(!(o instanceof xxxx) return false;
       xxx in = (xxx)o;
       return ……..
} 
 

改写equals方法的告诫:

  1. 不要企图让equals方法做太多事。
  2. 不要使equals依赖不可靠的资源,否则会违背一致性。
  3. 不要将equals中的对象装换为其他的类型。
  4. 要注意的时候不要提供这样的方法public boolean equals(MyClass o)这样是重载并不是覆盖Object的equals方法。

总结:不用重写equals方法就尽量不要去找麻烦,确实需要改写equals方法时,遵守通用约定,因为对象会在程序中不停的传递,所以可能会导致程序运行不正常,甚至崩溃而很难找到程序崩溃的原因。总之,还是遵守约定吧!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics