什么时候班级应该是Comparable和/或Comparator?

我见过实现ComparableComparator的类 。 这是什么意思? 为什么我会用另一种呢?


下面的文本来自Comparator vs Comparable

可比

一个可比较的对象能够将自己与另一个对象进行比较。 类本身必须实现java.lang.Comparable接口,以便能够比较它的实例。

比较

比较对象能够比较两个不同的对象。 该类不是比较它的实例,而是一些其他类的实例。 这个比较器类必须实现java.util.Comparator接口。


实现Comparable意味着“我可以将自己与另一个对象进行比较。” 当有一个自然的默认比较时,这通常很有用。

实现Comparator意味着“我可以比较两个其他对象。” 当有多种方法比较两个类型的实例时,这通常很有用 - 例如,您可以根据年龄,名称等比较人们。


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

  • 它在同一个班上 (这通常是一个优点)
  • 只能有一个实现 (所以如果你想要两个不同的情况,你不能使用它)
  • 相比之下,比较器是一个外部比较:

  • 它通常在一个独特的实例中(无论是在同一个班级还是在另一个地方)
  • 你用你想要分类的东西来命名每个实现
  • 你可以为你不能控制的类提供比较器
  • 即使第一个对象为空,该实现也是可用的

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

    作为一个指导原则,我通常使用最常用的类或接口,可以在所有使用情况下比较该对象的可能性......但不是非常精确的定义! :-(

  • Comparable<Object>可让您在编译时在所有代码中使用它(如果需要,这是很好的选择,如果不是,那么您就可以避免编译时错误); 你的实现必须处理对象,并根据需要进行强制转换,但强大。
  • Comparable<Itself>非常严格。
  • 有趣的是,当你把它自己子类化到子类时,子类必须也是可比较的并且对它很有帮助(否则它会破坏Liskov原理,并给你运行时错误)。

    链接地址: http://www.djcxy.com/p/91925.html

    上一篇: When should a class be Comparable and/or Comparator?

    下一篇: In ConcurrentHashMap how the segments are defined