在子类中实现Comparable <t> </t>

时间:2015-01-27 12:55:35

标签: java

假设我有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

2 个答案:

答案 0 :(得分:1)

正如@John B所说,使用Comparator,即查看Collections.sort()方法文档。

或者您也可以SpecificRuleComparable方法以一致的方式实施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课程包含firstNamelastNameage字段。如果您要将Person作为Comparable的实例,则需要在名字上决定应用哪种排序顺序?姓?年龄?上升还是下降?

另一方面,如果您要提供默认的Comparator实施(比如静态字段),您可以让Person班级的用户确切地确定他们需要什么,取决于上下文及其用例。

这是有道理的,实际上:Person不知道如何对自己进行排序。进行排序的实体知道应该如何完成,而且并非所有实体都会就相同的排序顺序达成一致。