Как можно избежать нескольких блоков if для метода Object.equals? - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь реализовать это:

public boolean equals(Object o) {
    if (o == this) {
        return true;
    }
    if ((null == o) || !(o instanceof Document)) {
        return false;
    }
    Document other = (Document) o;
    // compare in a null-safe manner
    if (list == null) {
        if (other.list != null)
            return false;
    } else if (other.list == null)
        return false;
    else if (!(list.size() == other.list.size())
            && !(list.equals(other.list)))
        return false;
    return true;

, где 'list' - это переменная класса, а также поле объекта 'o'. Обратите внимание, что объект 'o' имеет много других полей, включая логические значения и коллекцию, и мне нужно сравнить их все. Я пытался найти похожие ответы, но большинство из них рекомендует переключать случаи или другие компоненты Java 8, что не относится к моему сценарию.

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Вы сильно усложняете вещи. Написание «равно» - это длинный скучный шаблон, но вы делаете его еще длиннее.

public boolean equals(Object o) {
    if (o == this) {
        return true;
    }
    if (!(o instanceof Document)) {
        return false;
    }
    Document other = (Document) o;
    if (!Objects.equals(list, other.list)) {
        return false;
    }
    return true;
}

Все, что вам нужно для каждого поля ссылки, - это три строки выше, аналогично для примитивов (не забудьте обработать NaN для плавающей запятой).

Ваше состояние не только намного дольше, но и ему не хватает симметрии. Это усложняет написание и делает его более подверженным ошибкам.

В любом случае, написание «равно» - это не то, что вы должны часто делать вручную. Я рекомендую использовать Lombok , и есть еще много инструментов, например, AutoValue или EqualsBuilder .

0 голосов
/ 06 февраля 2020

Прямая перезапись:

// compare in a null-safe manner
if (list == null || other.list == null) {
    return list == other.list;
} else {
    return list.size() == other.list.size() ||
           list.equals(other.list));
}

, за исключением случаев, когда тип list является стандартным Java SE List классом, который можно исключить с помощью микрооптимизации size(). (Типичная реализация List.equals сделает это за вас.) Таким образом, мы можем переписать вышеприведенное как

// compare in a null-safe manner
if (list == null || other.list == null) {
    return list == other.list;
} else {
    return list.equals(other.list));
}

, за исключением того, что Objects.equals(...) делает. Итак, окончательная перезапись:

// compare in a null-safe manner
return Objects.equals(list, other.list);

Неясно, будет ли среда IDE генерировать equals методы для проверки полей в нулевом безопасном режиме. Но противоположность этому заключается в том, что желательно разрабатывать свои классы так, чтобы вам не нужно было это делать. Например, используйте пустой List вместо null.

...