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

Jes*_*ose 9 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();
}
Run Code Online (Sandbox Code Playgroud)

CompareToBuilder这里有什么好处?它是如何employeetotal属性相互作用的?


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

cha*_*aos 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;
}
Run Code Online (Sandbox Code Playgroud)

所以,基本上发生的事情是它将根据你追加它们的顺序比较属性.在您的代码示例中,将首先评估"employee".如果左侧属性的评估小于或大于右侧,则忽略总计.

仅当"employee"评估为相等时,才会评估属性"total".


qua*_*lar 5

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

CompareToBuilder正在为您做这件事 - 每个append()方法都在添加一个新的比较,并且所有比较都被&&编辑.

所以您发布的代码equals()在员工对象上运行total.