什么时候课程应该是可比较的和/或比较者? [关闭]

问题

我见过的类实现了两个ComparableComparator.这是什么意思?为什么我会使用一个而不是另一个?


#1 热门回答(200 赞)

以下文字来自Comparator vs Comparable
可比
可比较的对象能够将自己与另一个对象进行比较。类本身必须实现java.lang.Comparable接口才能比较其实例。
比较器
比较器对象能够比较两个不同的对象。该类不是比较它的实例,而是比较其他类的实例。该比较器类必须实现java.util.Comparator接口。


#2 热门回答(120 赞)

实现Comparable意思是"我可以将自己与另一个对象进行比较。"当存在单个自然默认比较时,这通常很有用。

实现Comparator意思是"我可以比较其他两个对象"。当有多种方法比较两种类型的实例时,这通常很有用 - 例如你可以按年龄,姓名等比较人。


#3 热门回答(33 赞)

Comparable让一个类实现自己的比较:

  • 它在同一个班级(这通常是一个优势)
  • 只能有一个实现(如果你想要两种不同的情况,你不能使用它)

相比之下,Comparator是一个外部比较:

  • 它通常在一个独特的实例中(在同一个类或在另一个地方)
  • 你可以按照要对事物进行排序的方式命名每个实现
  • 你可以为你无法控制的课程提供比较器
  • 即使第一个对象为null,该实现也是可用的

在这两种实现中,你仍然可以选择你想要比较的内容**.使用泛型,你可以声明,并在编译时检查它。这提高了安全性,但确定适当的值也是一个挑战。

作为指导,我通常使用可以比较该对象的最通用的类​​或接口,在我设想的所有用例中......虽然定义不是很精确! :-(

  • Comparable <Object>允许你在编译时在所有代码中使用它(如果需要可以使用它,如果没有则可以使用,如果没有,则会丢失编译时错误);你的实现必须处理对象,并根据需要但以强大的方式进行转换。
  • 相比之下,可比较的<本身>非常严格。

有趣的是,当你将它自己子类化为子类时,子类也必须是可比较的并且对它是健壮的(或者它会破坏Liskov原理,并给你运行时错误)。