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

时间:2017-07-14 10:18:11

标签: java oop design-patterns interface abstract-class

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

我们不能仅通过使用“Comparable”来实现同样的目标吗? 。假设第三方通过首先实施“可比较”来编写比较逻辑。 为什么我们不能使用“Comparable”实现新类并将类似实例传递给排序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

1 个答案:

答案 0 :(得分:1)

这些两个不同的功能。

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

比较者说:"我知道如何比较某种类型的两个物体"。

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

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

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

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

除此之外:似乎你没有明白我的观点。事情是:这两个概念是简单的两个不同的 抽象。当然,你可以构建一些复杂的东西来表达一个概念在另一个概念方面的作用。但这就像使用锤子将螺钉插入墙壁。它只会造成比解决问题更多的问题。你建议让另一个类实现Comparable以便以不同的方式排序 - 归结为实例化一个附加对象每个列表条目。效率不高。对于任何有经验的Java程序员来说,也非常反直觉。除非必须,否则你不会发明自己的轮子。而且,当你从头开始清楚地知道这个车轮与现有的,众所周知且广泛使用的车轮相比时,你会忘记发明自己的车轮。