-----------------------------------------------摘自java核心技术卷1
编写一个完美的equals方法的建议
- 显式参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量。
- 检测this与otherObject是否引用同一个对象,即是否指向同一个地址
if(this==otherObject) return true; - 检测otherObject是否为null,如果为null则返回false。
- 比较this与otherObject是否属于同一个类。如果equals语义在每个子类中有所改变,就使用getClass检测:
if(getClass()!=otherObject.getClass()) return false;
如果所有的子类都拥有统一的语义,就使用instanceof检测:
if(!(otherObject instanceof ClassName)) return false; - 将otherObject转换为相应的类类型变量
ClassName other=(ClassName)otherObject - 现在开始对所有需要比较的域进行比较。使用==比较基本类型域,使用equals比较对象域。如果所有的域都匹配,就返回true;否则返回false。
return field1(==other.field1&&Objects.equals(field2,other.field2)&&…;
如果在子类中重新定义equals,就要在其中包含调用super.equals(other)。