Корректная реализация equals для класса Exam

Сравните id и mark через ==, а date — через Objects.equals, чтобы корректно обработать null. Вместе с equals необходимо переопределить hashCode по тем же полям.

Короткий ответ

Что ответить на собеседовании

Сравните 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 нарушает корректность поиска.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее