Что именно делает org.apache.commons.lang.builder.CompareToBuilder? - PullRequest
9 голосов
/ 06 февраля 2012

Я узнал об интерфейсе 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?


Я прочитал javadocs , но я не могу понять, с чем они работаютконструктор и кратные append с.Указывает ли этот вопрос на неясные намерения и ноль исследований?

Ответы [ 2 ]

12 голосов
/ 04 июня 2014

Я пытался выяснить, как 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;
}

Итак, в основном происходит сравнение атрибутов на основе порядка их добавления. В вашем примере кода сначала будет оцениваться «сотрудник». Если атрибуты левой стороны оцениваются как меньшие или большие, чем правая часть, итоговое значение не учитывается.

Атрибут «total» будет оцениваться только в том случае, если «employee» оценивается как равный.

5 голосов
/ 06 февраля 2012

Этот класс призван помочь вам в создании compareTo() -методов.Представьте, что в вашем классе было более двух полей - ручное кодирование вашего метода сравнения может быть довольно громоздким.

CompareToBuilder делает это за вас - каждый метод append() добавляет новое сравнение, и все сравнения&& ed.

Итак, код, который вы разместили, запускается equals() на объекте работника и total.

...