Напишите метод равных - PullRequest
0 голосов
/ 26 апреля 2019

Достаточно ли первого равного для всех случаев или лучше использовать второе? Я попробовал оба варианта и получил те же результаты, но, возможно, есть случай, который я не пробовал.


public boolean equals(Object o) {
    if (o == this) return true;
    if (!(o instanceof Test)) {
        return false;
    }
    Test test = (Test) o;
    return name.equals(test.name);
}


public boolean equals(Object obj) {
    if (this == obj) return true;
    if (obj == null) return false;
    if (this.getClass() != obj.getClass()) return false;
    Test other = (Test) obj;
    if (name == null && other.name != null) {
        return false;
    } else if (!name.equals(other.name)) {
        return false;
    }
    return true;
}

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Если name не может быть нулевым, первый метод подходит; если оно может быть нулевым, внесите небольшое изменение в окончательный оператор возврата:

return Objects.equals(name, test.name);

Это просто позволяет избежать NPE, если name равно нулю.


Не использовать getClass() в проверках equals: это нарушает подставляемость Лискова подклассами.

Более подробное описание и пример можно найти в документации Проверка Проне ошибки для getClass() вызовов в equals методах.

0 голосов
/ 27 апреля 2019

Если имя не может быть нулевым, первого равенства () должно быть достаточно.Если name может быть нулевым, оба варианта недостаточны (второе равенство не проверяет оба имени == null).

Если name (и все поля, которые входят в equals ()) неизменны, вы должны иметьпосмотрите на Процессор аннотаций Google Auto value , который обеспечивает автоматическую генерацию equals (), hashCode () и toString ().

...