一尘不染

Java何时使用可比和比较器

java

我有一个需要在字段上排序的对象列表,例如“分数”。我不加思索地编写了一个实现Comparator的新类,该类可以完成任务并且可以工作。

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

  1. 我做的可接受的做法是什么?
  2. 正确的方法是“首先让类实现Comparable(用于自然排序),如果需要替代字段比较,然后创建一个实现Comparator的新类”?
  3. 如果上面的(2)是正确的,那么这是否意味着只有在使类实现Comparable之后才应该实现Comparator?(假设我拥有原始班级)。

阅读 557

收藏
2020-03-09

共2个答案

一尘不染

我要说的是,如果对象是对类进行排序的明显自然方法,则该对象应实现Comparable,并且任何需要对类进行排序的人通常都希望采用这种方式。

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

换句话说,给定类名,是否清楚可比对象如何排序,还是必须诉诸于Javadoc?如果是后者,则很可能每个将来的排序用例都需要一个比较器,这时可比的实现可能会减慢该类的用户,而不是加快它们的速度。

2020-03-09
一尘不染

使用Comparable,如果要定义一个默认的(天然)排序问题的对象的行为,常见的做法是使用的技术或自然(数据库?)的对象标识符这一点。

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

2020-03-09