假设我有3个类似的那样:
Rule.class:
public class Rule {
private String name;
//Getters & Setters
}
PrioritizedRule.class:
public class PrioritizedRule extends Rule implements Comaparable<PrioritizedRule> {
private int priority;
@Override
public int compareTo(PrioritizedRule y) {
return Integer.compare(this.getPriority(), y.getPriority());
}
//Getters & Setters
}
SpecificRule.class
public class SpecificRule extends PrioritizedRule {
private double specificValue;
//Getters & Setters
}
在这个子类中实现Comparable被认为是不好的做法,因为它不一定能保证SpecificRule与equals的比较一致吗? (which is recommended according to the Java documentation)
答案 0 :(得分:1)
正如@John B所说,使用Comparator
,即查看Collections.sort()方法文档。
或者您也可以SpecificRule
以Comparable
方法以一致的方式实施PrioritizedRule.compareTo()
:
public class SpecificRule
extends PrioritizedRule
implements Comaparable<SpecificRule> {
private double specificValue;
@Override
public int compareTo(SpecificRule y) {
int c = Integer.compare(this.getPriority(), y.getPriority());
if (c == 0) {
return Double.compare(this.getSpecificValue(), y.getSpecificValue());
}
return c;
}
//Getters & Setters
}
答案 1 :(得分:-2)
这可能不是您正在寻找的答案,我意识到我有点偏离主题,但我认为实施Comparable
本身就是不好的做法。
可以使用Comparable
实例的大多数(所有?)方法都有一个使用Comparator
的版本。通过使用Comparable
,您可以为您的班级硬编码单个可能的排序顺序。
例如,假设您的Person
课程包含firstName
,lastName
和age
字段。如果您要将Person
作为Comparable
的实例,则需要在名字上决定应用哪种排序顺序?姓?年龄?上升还是下降?
另一方面,如果您要提供默认的Comparator
实施(比如静态字段),您可以让Person
班级的用户确切地确定他们需要什么,取决于上下文及其用例。
这是有道理的,实际上:Person
不知道如何对自己进行排序。进行排序的实体知道应该如何完成,而且并非所有实体都会就相同的排序顺序达成一致。