为什么Java提供了两个不同的接口(Comparable/Comparator)来比较对象?



我想知道为什么java Java提供了两种不同的接口(Comparable/Comparator)来比较对象。我认为与其证明一个新的接口(Comparator)来比较具有多个属性的对象,Java可以简单地扩展"Comparable"接口来实现"Comparator"接口逻辑。

难道我们不能只使用"可比"来实现相同的效果吗? .假设某个第三方通过首先实现"可比"来编写比较逻辑。为什么我们不能实现一个具有"可比性"的新类并将可比较的实例传递给排序 API?

两者都在同一个 Java 版本 1.2 中引入。我无法理解为什么两个不同的界面可以实现相同的功能。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Comparable.java#Comparable

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Comparator.java

这是两种不同的功能。

可比表示:"我可以将自己与同类中的另一个对象进行比较"。

比较器说:"我知道如何比较某种类型的两个对象"。

这些是不同的用例 - 你只是想要两者- 只是针对不同的情况。

示例:当您想要对来自外部库的某些对象进行排序时。相应的类不实现Comparable- 但您仍然可以通过提供比较器对它们进行排序。

另一个示例:假设您有一个具有各种属性的对象列表。现在,您可以为该类创建不同的比较器;每个都比较一个不同的字段 - 允许您在 Person.getName() 或 Person.getAge() 上对List<Person>进行排序,...

另一方面,你有像 Integer 这样的类 - 一个 Integer 知道如何将自己与另一个 Integer 进行比较是有意义的。仅仅因为数字的自然顺序也应该是对象模型的一部分。

除此之外:你似乎不明白我的意思。问题是:这两个概念是简单的两个不同的抽象。当然,你可以构建一些复杂的东西来表达一个概念在另一个概念中的作用。但这就像用锤子把螺丝钉进墙上一样。它只会产生比解决更多的问题。您建议让另一个类实现 Comparable 以便以不同的方式进行排序 - 归结为每个列表条目实例化一个添加对象。一点效率都没有。对于任何有经验的Java程序员来说,这也是非常违反直觉的。除非必要,否则你不会发明自己的轮子。而且,当从头开始很明显,与已经存在的、众所周知的和广泛使用的轮子相比,这个轮子会有所缺陷时,你就会忘记发明自己的轮子。

最新更新