【发布时间】:2011-08-12 16:17:30
【问题描述】:
我一直想知道如何最好地为实现相同接口的一系列类实现 equals()(并且客户端应该只使用所述接口并且永远不知道实现类)。
我还没有编写自己的具体示例,但是 JDK 中有两个示例 - java.lang.Number 和 java.lang.CharSequence 说明了这个决定:
boolean b1 = new Byte(0).equals( new Integer(0) ) );
或使用 CharSequence
boolean b2 = "".equals(new StringBuilder());
理想情况下,您是否希望这些评估结果为真?两种类型都实现了相同的数据类型接口,作为使用 Numbers(分别是 CharSequences)实例的客户端,如果 equals 比较接口类型而不是实现类型,我会更轻松。
现在这不是一个理想的例子,因为 JDK 将实现类型公开给公众,但假设我们不必维护与现有内容的兼容性 - 从设计人员的角度来看:应该 em> 等于检查接口还是更好地检查实现?
注意:我知道在实践中真正正确实现对接口的相等性检查可能非常困难,而且它甚至更加棘手,因为相等的接口也需要返回相同的 hashCode()。 但这些只是实现中的障碍,例如 CharSequence,虽然接口非常小,但相等检查所需的一切都存在,而没有揭示实现的内部结构(因此原则上可以正确实现,即使 没有 提前了解未来的实现)。 但我对设计方面更感兴趣,而不是如何实际实现它。我不会仅仅根据实现的难易程度来决定。
【问题讨论】: