何时使用可比较和比较器

2022-08-31 08:47:15

我有一个对象列表,我需要对字段进行排序,比如 Score。我没有多想,就写了一个实现比较器的新类,它完成了任务,并且它工作了。

现在回顾一下,我想知道我是否应该让我的类实现Compeable,而不是创建一个实现Compolarator的新类。分数是对象将在其上排序的唯一字段。

  1. 我做了什么可以接受的练习?

  2. 正确的方法是否“首先让类实现可比性(用于自然排序),如果需要替代字段比较,则创建一个实现比较器的新类”?

  3. 如果上面的(2)是真的,那么这是否意味着只有在他们有类实现Compable之后才应该实现Compolarator?(假设我拥有原始类)。


答案 1

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

如果要定义外部可控排序行为,请使用比较器,这可以覆盖默认排序行为。


答案 2

我想说的是,如果一个对象是排序类的清晰自然的方式,那么它应该实现Compaable,并且任何需要对类进行排序的人通常都希望这样做。

但是,如果排序是类的不寻常用法,或者排序仅对特定用例有意义,则比较器是更好的选择。

换句话说,给定类名,是否清楚可比较的排序方式,或者您是否必须诉诸于阅读javadoc?如果是后者,那么很可能每个未来的排序用例都需要一个比较器,此时可比较的实现可能会减慢该类的用户,而不是加快他们的速度。


推荐