org.apache.commons.lang.builder.CompareToBuilder究竟做了什么?

时间:2012-02-06 14:11:09

标签: java apache-commons

我了解了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属性进行交互的?


我确实读过the javadocs,但是我无法用构造函数和多个append来做他们正在做的事情。这个问题是否表明意图不明确和零研究?

2 个答案:

答案 0 :(得分:12)

我试图弄清楚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”。

答案 1 :(得分:5)

本课程旨在帮助您构建compareTo() - 方法。想象一下,你的课程中只有2个字段 - 手动编写比较方法可能非常麻烦。

CompareToBuilder正在为您做到这一点 - 每个append()方法都在添加新的比较,所有比较都是&&

因此,您发布的代码在员工对象和equals()上运行total