下面是编写完美的equals方法的建议:
1、现实参数命名为otherObject -- 稍后,我们需要把它类型转换为零一个叫做other的变量
2、测试this同otherObject是否是同一个对象:
if (this == otherObject) return true;
这其实只是一个优化。实践中,是同一个对象的情况很常见。检查是否相等比进行字段比较花费的开销要小得多。
3、测试otherObject是否为null,如果是,就返回false。这项测试是必需的。
if (otherObject == null) reutrn false;
4、测试this和otherObject是否属于同一个类。这项测试是“对称性规则”所要求的。
if (getClass() != otherObject.getClass()) return false;
5、把otherObject的类型转换为你的类所属的类型:
ClassName other = (ClassName)otherObject
6、最后,比较所有的字段。使用 == 比较基本类型字段,使用equals比较对象字段。如果所有字段都匹配,则返回true;否则,返回false。
return field1 == other.field1 && field2.equals (other.field2)
如果遵循以上的规则定义了一个类的equals方法,定义其子类的equals方法时,首先调用超类的equals方法。如果这项测试不能通过,对象也就不可能相等。如果超类字段相等,那么需要比较子类的实例字段。
class Manager extends Employee
{
...
public boolean equals (Object otherObject)
{
if (!super.equals (otherObject)) return false;
Manager other = (Manager)otherObject;
//
return bonus == other.bonus;
}
}