Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java提供了两个不同的接口(Comparable/Comparator)来比较对象?_Java_Oop_Design Patterns_Interface_Abstract Class - Fatal编程技术网

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

为什么Java提供了两个不同的接口(Comparable/Comparator)来比较对象?,java,oop,design-patterns,interface,abstract-class,Java,Oop,Design Patterns,Interface,Abstract Class,我想知道为什么java提供了两个不同的接口(Comparable/Comparator)来比较对象。我认为Java可以简单地扩展“Comparable”接口来实现“Comparator”接口逻辑,而不是证明一个新接口(Comparator)来比较具有多个属性的对象 难道我们不能仅通过使用“可比”来实现同样的目标吗。比如说,某个第三方通过首先实现“Comparable”来编写比较逻辑为什么我们不能用“Compariable”实现一个新类,并将Compariable实例传递给排序API? 这两个版本

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


难道我们不能仅通过使用“可比”来实现同样的目标吗。比如说,某个第三方通过首先实现“Comparable”来编写比较逻辑为什么我们不能用“Compariable”实现一个新类,并将Compariable实例传递给排序API?

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


这是两种不同的功能

Comparable表示:“我可以将自己与同类的另一个对象进行比较”

比较器说:“我知道如何比较两个特定种类的物体。”

这些用例是不同的,你只需要针对不同的情况同时使用它们

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

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

另一方面,您有类似Integer的类,其中一个整数知道如何将自己与另一个整数进行比较,这很有意义。因为数字的自然顺序也应该是对象模型的一部分


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

@Bathsheba,我的问题是,为什么Java设计成这样?。这与何时使用comparator和comparable无关。而且,这与比较指标和可比指标之间的差异无关。请理解我的问题。我的问题是,为什么Java设计成这样?我想这不是基于意见的。这应该有一些强有力的理由,有些人可能知道,但我们不知道,因为这两个接口都是在同一个Java版本1.2中引入的。我不明白为什么需要两个不同的接口来实现一个单一的功能。难道我们不能只用“可比”来实现相同的功能吗。假设某个第三方通过实现“Comparable”编写了一个比较逻辑。为什么我们不能用Comparable实现一个新类,并将Comparable实例传递给排序API呢。我重新开始这个问题。我的回答很长。什么会回来?还有问题。好吧,不管怎样:以你的例子,写下你的代码。然后看看实现一个合理的“类似比较器”的构造有多复杂——使用另一个可比较的类x来比较类y的对象。当然,这是可能的,但这将是极为低效的,简单的感觉就像一个肮脏的黑客。你最终会得到一个从一开始就被打破的设计。当然。让我试试。