Я не уверен, какой смысл это имеет, но если я не понял неправильно, он удовлетворяет вашим требованиям:
public class Date {
private int year;
private int month;
private int day;
// Constructor etc.
@Override
public boolean equals(Object obj) {
Date otherDate = (Date) obj;
return Boolean.logicalAnd(year == otherDate.year,
Boolean.logicalAnd(month == otherDate.month, day == otherDate.day));
}
@Override
public int hashCode() {
return Objects.hash(year, month, day);
}
}
Я использую метод класса Boolean
(статический метод в классе Boolean
) logicalAnd
вместо &&
. Поскольку каждый аргумент вычисляется до вызова метода, это не приводит к короткому замыканию оценки, как &&
. В противном случае это дает тот же результат. Поскольку у вас есть три подусловия, а метод принимает только два аргумента, мне нужно было вставить вызов в качестве одного из аргументов в первом вызове.
Как было сказано в комментариях, метод должен возвращать примитив boolean
(маленький b
) и должен иметь аннотацию @Override
. Кроме того, при переопределении equals
рекомендуется также переопределить hashCode
и убедиться, что равные объекты имеют одинаковые хэш-коды.
Для производственного кода нужно использовать встроенный LocalDate
, а не писать собственный класс Date
. LocalDate
уже переопределяет equals
и hashCode
, и нам не нужно беспокоиться о том, как они реализованы.