我了解了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
在这做什么?它是如何与employee
和total
属性进行交互的?
我确实读过the javadocs,但是我无法用构造函数和多个append
来做他们正在做的事情。这个问题是否表明意图不明确和零研究?
答案 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
。