java equals getclass_有没有理由在生成.equals()时更喜欢getClass()而不是instanceof?...

结论

解剖了四个任意选择的equals()实现的例子,我们得出什么结论?

首先:在equals()的实现中,有两种截然不同的方式来执行类型匹配检查。类可以通过instanceof运算符允许超类和子类对象之间的混合类型比较,或者类可以通过getClass()测试将不同类型的对象视为不相等。上面的示例很好地说明了使用getClass()的equals()实现通常比使用instanceof的实现更强大。

instanceof测试仅对最终类是正确的,或者至少方法equals()在超类中是最终的。后者基本上意味着没有子类必须扩展超类的状态,但只能添加与对象的状态和行为无关的功能或字段,例如瞬态或静态字段。

另一方面,使用getClass()测试的实现始终符合equals()契约; 他们是正确和强大的。但是,它们在语义上与使用instanceof测试的实现非常不同。使用getClass()的实现不允许比较子类和超类对象,即使子类没有添加任何字段,甚至不想重写equals()。这样一个“普通的”类扩展例如是在为这个“普通”目的而定义的子类中添加调试打印方法。如果超类通过getClass()检查禁止混合类型比较,那么普通扩展将无法与其超类相比。这是否完全取决于类的语义和扩展的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值