【问题标题】:Why Java provided two different interfaces(Comparable/Comparator) to compare objects?为什么 Java 提供了两个不同的接口(Comparable/Comparator)来比较对象?
【发布时间】:2017-12-19 09:50:45
【问题描述】:

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

我们不能仅通过使用“Comparable”来实现相同的目标吗? .假设某个第 3 方通过首先实现“可比较”来编写比较逻辑。 为什么我们不能用“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

【问题讨论】:

  • @Bathsheba ,我的问题是,为什么 Java 是这样设计的?这与何时使用比较器和可比较性无关。而且这与比较器和可比较器之间的区别无关。请理解我的问题。
  • 我的问题是,为什么Java是这样设计的?
  • 我猜这不是基于意见的。这应该有一些强有力的理由,有人可能知道我们不知道。
  • 因为这两个接口都是在同一个 Java 版本 1.2 中引入的。我不明白为什么要实现一个功能需要两个不同的界面。

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


【解决方案1】:

这是两个不同的功能。

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

Comparator 说:“我知道如何比较某种类型的两个对象”。

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

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

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

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

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

【讨论】:

  • 我们不能只使用“Comparable”来达到同样的效果吗? .假设某些第 3 方通过实现“可比较”来编写比较逻辑。为什么我们不能用 Comparable 实现一个新类并将可比较实例传递给排序 API?
  • 所以。我重新提出问题。我给出一个冗长的答案。什么回来了?更多问题。好吧,无论如何:以您的示例并真正写下该代码。然后看看实现一个合理的“类比较器”结构会有多复杂——使用另一个可比较的类 x 来比较类 y 的对象。当然这是可能的——但这会非常低效,而且感觉就像一个肮脏的黑客。你最终会得到一个从一开始就被破坏的设计。
  • 当然。让我试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
相关资源
最近更新 更多