下列情况是不需要改写equals方法的:
- 同一个类的不同实例本质上是唯一的,就是个实例都有自己的本体(Identify)。
- 不关心该类是否提供了逻辑相等的功能。
- 父类已经改写过equals方法,对于子类来说,继承过来的equals方法已经是最合适的了。
- 一个类是私有的或者是包可见的,且确定它的equals方法不会被调用。
对于需要改写equals方法的时候,应该遵守如下约定:
- 自反性,即x.equals(x)为true.
- 对称性,即当且仅当x.equals(y)为true时y.equals(x)也一定为true。
- 传递性,即对任意的x,y,z,如果x.equals(y)为true,并且y.equals(z)也为true,那么x.equals(z)也必须为true。
- 一致性,即对于任意的x,y,如果x,y都没有被修改的话,那么多次调用x.equals(y)要么一致地返回ture,要么一致地返回false.
- 对于非空的引用x,x.equals(null)一定要返回false.
改写equals方法时的建议:
- 用==操作符检查实参是否为指向对象的同一个引用。
- 使用instanceOf检查实参是否是正确的类型。
- 在2的基础上,把实参转换成正确的类型。
- 检查实参的域与当前对象的域值是否相等。
- 编写完equals方法后,检查是否满足等价关系。
例如:
public boolean equals(Object o)
{
if(o== this) return true;
if(!(o instanceof xxxx) return false;
xxx in = (xxx)o;
return ……..
}
改写equals方法的告诫:
- 不要企图让equals方法做太多事。
- 不要使equals依赖不可靠的资源,否则会违背一致性。
- 不要将equals中的对象装换为其他的类型。
- 要注意的时候不要提供这样的方法public boolean equals(MyClass o)这样是重载并不是覆盖Object的equals方法。
总结:不用重写equals方法就尽量不要去找麻烦,确实需要改写equals方法时,遵守通用约定,因为对象会在程序中不停的传递,所以可能会导致程序运行不正常,甚至崩溃而很难找到程序崩溃的原因。总之,还是遵守约定吧!