[ОБНОВЛЕНИЕ] Netbeans правильно создал метод, как вы можете видеть, он использует! в сравнении, поэтому он использует OR и! равно внутри:
return !(
(this.id == null && other.id != null) ||
(this.id != null && !this.id.equals(other.id))
);
Итак, следуя реализации для Objects.equals (начиная с версии 1.7), это будет предпочтительнее:
(this.id != null) && (this.id.equals(other.id))
И вместо этого кода для equals и hashCode вы можете получить:
import java.util.Objects;
@Override
public boolean equals(Object object) {
if (this == object) return true;
if (object == null || getClass() != object.getClass()) return false;
Department department = (Department) object;
return Objects.equals(id, department.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
Вот реализация, которую Objects.hash вызывает в конце:
public static int hashCode(Object a[]) {
if (a == null)
return 0;
int result = 1;
for (Object element : a)
result = 31 * result + (element == null ? 0 : element.hashCode());
return result;
}
Что касается метода hashCode, то лучше использовать те же поля, что и в уравнениях равенства.
Здесь попробуйте использовать поля, идентифицирующие сущность как единое целое, например:
- поле имя уникально, затем используйте имя.
- поле имя и число уникальны, затем используйте оба.
Как только объект был создан, у вас не должно быть установщика для вашего поля Id. У вас может быть конструктор, в который вы его получите вместо использования в модульных тестах, но не сеттер. Неизменяемые объекты - хороший способ следовать, но если вы не можете, по крайней мере поле, идентифицирующее экземпляр, не должно измениться.
Надеюсь, что смогу помочь.