У меня есть класс Reminder
, который имеет как hashcode
, так и equals
переопределенный следующим образом:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((cronExpression == null) ? 0 : cronExpression.hashCode());
result = prime * result + ((subject == null) ? 0 : subject.hashCode());
result = prime * result + timeout;
result = prime * result + ((type == null) ? 0 : type.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Reminder))
return false;
Reminder other = (Reminder) obj;
if (cronExpression == null) {
if (other.cronExpression != null)
return false;
} else if (!cronExpression.equals(other.cronExpression))
return false;
if (subject == null) {
if (other.subject != null)
return false;
} else if (!subject.equals(other.subject))
return false;
if (timeout != other.timeout)
return false;
if (type == null) {
if (other.type != null)
return false;
} else if (!type.equals(other.type))
return false;
return true;
}
Оба переопределения были автоматически сгенерированы с использованием Eclipse.Я использую Reminder
в экземпляре HashSet, например: private Set<Reminder> localReminders = new HashSet<Reminder>();
При обновлении этого набора я использую localreminders.contains(anotherReminder)
, и по какой-то причине я пытался выяснить дляНекоторое время назад он не вызывает переопределенный метод equals
.Даже если cronExpression
, subject
, timeout
и type
сравниваемых напоминаний одинаковы, contains
возвращает ложь.
До сих пор я встречал только ответы, где equals
и / илиhashcode
были реализованы неправильно или не реализованы вообще.Буду очень признателен за любую помощь!
Дайте мне знать, если вам нужна дополнительная информация, например, дополнительный код для этого!
РЕДАКТИРОВАТЬ: свойства, используемые в hashcode
и equals
, все String
, за исключением timeout
, который равен int
.
EDIT2: во время отладки у меня в настоящее время есть два напоминания в моем HashSet:
Reminder [cronExpression=0 10 10 ? * *, subject=, type=OTHER_TYPE, audioPath=/other_type_reminder.mp3, muted=false, future=DelegatingErrorHandlingRunnable for Task@af94b0, timeout=35940]
Reminder [cronExpression=50 53 10 ? * *, subject=sub, type=TYPE, audioPath=/type_reminder.mp3, muted=false, future=DelegatingErrorHandlingRunnable for ReminderTask@f1f373, timeout=35940]
Тот, который я проверяю, содержится ли он в моем наборе, выглядит следующим образом:
Reminder [cronExpression=50 53 10 ? * *, subject=sub, type=TYPE, audioPath=/type_reminder.mp3, muted=false, future=null, timeout=35940]
Единственное отличие, которое я могу заметить, заключается в том, что в одном, future
равно null
, в то время как оно фактически установлено в другом.Но так как свойство future
не включено ни в hashcode
, ни в 'equals', это не должно иметь значения.