У меня есть класс с циклом в пределах equals / hashCode :
class User {
private List<Task> tasks;
private ZonedDateTime date;
@Override
public int hashCode() {
int hash = 17;
hash = 31 * hash + (date != null ? date() : 0);
for (var task : tasks) {
hash = 31 * hash + task.hashCode();
}
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
final User other = (User) obj;
if (tasks.size() != other.tasks.size()) return false;
// needed?
for (int i = 0; i < tasks.size(); i++) {
if (!tasks.get(i).equals(other.tasks.get(i))) {
return false;
}
}
return Objects.equals(timeStamp, other.timeStamp) && Objects.equals(tasks, other. tasks);
}
}
У меня есть эта версия (версия 2) из equals / hashCode, который короче и быстрее:
@Override
public int hashCode() {
return Objects.hash(date, tasks);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
final User other = (User) obj;
return Objects.equals(timeStamp, other.timeStamp) && Objects.equals(tasks, other. tasks);
}
Можно ли заменить прежний equals / hashCode версией 2, не беспокоясь о правильности?
Обе версии возвращают один и тот же результат?
Подводя итог:
для типичной реализации List, мы можем использовать версию 2 вместо версии 1.
Еще один вопрос, связанный с этим:
Будет ли версия 2 также действительным, если свойство task
не является List
но Stream
? (Stream<Task> tasks
).