下面给出编写一个完美的equals方法的建议:
1)显式参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量
2)检测 this与otherObject是否引用同一个对象 :if(this == otherObject) return true;
3) 检测otherObject是否为 null ,如果为null,返回false.if(otherObject == null) return false;
4) 比较this与otherObject是否属于
同一个类
如果equals的语义在每个子类中有所改变,就使用getClass检测 :if(getClass()!=otherObject.getClass()) return false;
如果所有的子类都拥有统一的语义,就使用instanceof检测 :if(!(otherObject instanceof ClassName)) return false;
如果equals的语义在每个子类中有所改变,就使用getClass检测 :if(getClass()!=otherObject.getClass()) return false;
如果所有的子类都拥有统一的语义,就使用instanceof检测 :if(!(otherObject instanceof ClassName)) return false;
5) 将otherObject转换为相应的类类型变量:ClassName other = (ClassName) otherObject;
6) 现在开始对所有需要比较的 域进行比较 。使用==比较基本类型域,使用equals比较对象域。如果所有的域都匹配,就返回true,否则就返回flase.
如果在子类中重新定义equals,就要在其中包含调用super.equals(other)
——参考《Java2核心技术 第一卷:基础知识》
当此方法被重写时,通常有必要重写
hashCode 方法,以维护
hashCode 方法的常规协定,该协定声明 相等对象必须具有相等的哈希码 。
【改写equals方法时,总是要改写hashCode方法】