Сравните id и mark через ==, а date — через Objects.equals, чтобы корректно обработать null. Вместе с equals необходимо переопределить hashCode по тем же полям.
Корректная реализация equals для класса Exam
Сравните id и mark через ==, а date — через Objects.equals, чтобы корректно обработать null. Вместе с equals необходимо переопределить hashCode по тем же полям.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо написать метод equals, который будет правильно определять равенство двух экземпляров класса Exam. При сравнении должны учитываться все поля объекта: идентификатор, дата и оценка.
public class JetbulbInterview {
public static void main(String[] args) {
Exam exam1 = new Exam(1, "04.07.2021", 10);
Exam exam2 = new Exam(1, "04.07.2021", 10);
System.out.println(exam1.equals(exam2));
}
}
class Exam {
long id;
String date;
int mark;
public Exam(long id, String date, int mark) {
this.id = id;
this.date = date;
this.mark = mark;
}
}
Ответ
Сравните id и mark через ==, а date — через Objects.equals, чтобы корректно обработать null. Вместе с equals необходимо переопределить hashCode по тем же полям.
@Override
public boolean equals(Object other) {
if (this == other) return true;
if (other == null || getClass() != other.getClass()) return false;
Exam exam = (Exam) other;
return id == exam.id && mark == exam.mark
&& java.util.Objects.equals(date, exam.date);
}
@Override
public int hashCode() {
return java.util.Objects.hash(id, date, mark);
}
В примере результат true. Проверка getClass задаёт равенство только экземплярам одного точного класса. Поля лучше сделать неизменяемыми: изменение значений, участвующих в hashCode, после помещения в HashSet или ключи HashMap нарушает корректность поиска.