org.apache.commons.lang.builder.CompareToBuilder是做什么的?

11

我了解到Comparable这个接口,一个类必须实现compareTo方法。我正在使用该方法的一个项目如下:

public class EmployeeAssignmentTotal implements Comparable<EmployeeAssignmentTotal>, Serializable {

private Employee employee;
private int total;
....
public int compareTo(EmployeeAssignmentTotal other) {
    return new CompareToBuilder()
            .append(employee, other.employee)
            .append(total, other.total)
            .toComparison();
}
CompareToBuilder是做什么的?它如何与employeetotal属性交互?我已经阅读了javadocs文档,但我无法理解构造函数和多个append所做的事情。这个问题是否表明意图不清晰且没有进行任何研究?

3
Javadoc(http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/CompareToBuilder.html)有什么不清楚的地方吗? - skaffman
2
在许多方面它都不够清晰。特别是在计算生成的整数或者在附加序列如何影响返回值方面不太明确。 - Jonas Eicher
3
我发现这篇高度信息化的文章 - http://www.codejava.net/java-core/collections/sorting-a-list-by-multiple-attributes-example - Shatu
1
@Shatu,你的链接救了我的一天... - Simmant
2个回答

13

我一直在尝试弄清楚CompareToBuilder的工作原理,偶然找到了这篇帖子,但是对答案并不满意。例如,toComparison方法应该返回负整数、正整数或零,用于判断“左侧”是否小于、“右侧”是否大于或等于。

所以我的问题是,添加属性的顺序如何影响比较。为了回答这个问题,我唯一能做的就是检查源代码,我发现了这个:

public CompareToBuilder append(int lhs, int rhs) {
    if (this.comparison != 0) {
        return this;
    }
    this.comparison = ((lhs > rhs) ? 1 : (lhs < rhs) ? -1 : 0);
    return this;
}

基本上,正在发生的是它将根据您附加它们的顺序比较属性。在您的代码示例中,“employee”将首先进行评估。如果左侧属性计算小于或大于右侧属性,则总数将被忽略。

仅当“employee”计算相等时,才会评估属性“total”。


5

这个类旨在帮助您构建compareTo()方法。想象一下,如果您的类中不止有2个字段,手动编写比较方法可能会很麻烦。

CompareToBuilder为您完成了这项工作-每个append()方法都添加了一个新的比较,所有比较都使用&&运算符进行连接。

因此,您发布的代码在employee对象和total上运行equals()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接