问题

我有一个对象列表,我需要在一个字段上排序,比如分数。在没有多想的情况下,我编写了一个实现Comparator的新类,它可以执行任务并且可以正常运行。

现在回头看看,我想知道我是否应该让我的类实现Comparable,而不是创建一个实现Comparator的新类。分数是对象将被订购的唯一字段。

  • 作为一种做法,我做了什么?
  • 正确的方法是"首先让类实现Comparable(对于自然顺序),如果需要替代字段比较,那么创建一个实现Comparator的新类"?
  • 如果上面的(2)为真,那么它是否意味着只有在具有类实现Comparable之后才应该实现Comparator? (假设我拥有原始课程)。

#1 热门回答(116 赞)

如果要定义相关对象的默认**(自然)排序行为,请使用Comparable,通常的做法是使用对象的技术或自然(数据库?)标识符。

如果要定义一个外部可控制的行为,可以使用Comparator,这可以覆盖默认的排序行为。


#2 热门回答(73 赞)

我会说一个对象应该实现Comparable,如果这是对类进行排序的明确自然方式,并且任何人都需要对类进行排序通常会想要这样做。

但是,如果排序是类的异常使用,或者排序仅对特定用例有意义,那么比较器是更好的选择。

换句话说,鉴于类名,是否可以比较排序,或者你是否必须求助于阅读javadoc?如果是后者,可能性是每个未来的排序用例都需要一个比较器,此时可比较的实现可能会减慢类的用户,而不是加速它们。


#3 热门回答(49 赞)

UseComparable

  • 如果对象在你的控制之下。
  • 如果比较行为是主要的比较行为。

UseComparator

  • 如果对象超出你的控制范围,你无法使它们实现Comparable。
  • 当你想要比较与默认行为(由Comparable指定)行为不同的行为时。

原文链接