结论
解剖了四个任意选择的equals()实现的例子,我们得出什么结论?
首先:在equals()的实现中,有两种截然不同的方式来执行类型匹配检查。类可以通过instanceof运算符允许超类和子类对象之间的混合类型比较,或者类可以通过getClass()测试将不同类型的对象视为不相等。上面的示例很好地说明了使用getClass()的equals()实现通常比使用instanceof的实现更强大。
instanceof测试仅对最终类是正确的,或者至少方法equals()在超类中是最终的。后者基本上意味着没有子类必须扩展超类的状态,但只能添加与对象的状态和行为无关的功能或字段,例如瞬态或静态字段。
另一方面,使用getClass()测试的实现始终符合equals()契约; 他们是正确和强大的。但是,它们在语义上与使用instanceof测试的实现非常不同。使用getClass()的实现不允许比较子类和超类对象,即使子类没有添加任何字段,甚至不想重写equals()。这样一个“普通的”类扩展例如是在为这个“普通”目的而定义的子类中添加调试打印方法。如果超类通过getClass()检查禁止混合类型比较,那么普通扩展将无法与其超类相比。这是否完全取决于类的语义和扩展的目的。