Netbeans создает метод "равно" правильно? - PullRequest
0 голосов
/ 19 июня 2019

При создании сущности из базы данных Netbeans создает метод равных :

    public boolean equals(Object object){
       if(!(object instanceof Department)){
          return false;
       }
       Department other = (Department) object;
       return !(
                 (this.id == null && other.id != null) ||
                 (this.id != null && !this.id.equals(other.id))
               );
    }

И оператор возврата в соответствии с:

~ ((A ∧ ~ C) ∨ (~ A ∧ ~ B)) → (~ A ∨ C) ∧ (A ∨ B) → (C ∨ B)

равно:

(other.id == null) || (this.id.equals(other.id))

1. Это правильно или я должен изменить его на:

(this.id != null) && (this.id.equals(other.id))

2. Должен ли я использовать число, подобное 10, вместо идентификатора автоматического приращенияв метод hashCode ?

3. , если Natural Id или бизнес-идентификатор полностью неизменны или могут быть изменены.я имею в виду, я должен определить метод setter для него?

1 Ответ

1 голос
/ 19 июня 2019

[ОБНОВЛЕНИЕ] 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;
}
  1. Что касается метода hashCode, то лучше использовать те же поля, что и в уравнениях равенства. Здесь попробуйте использовать поля, идентифицирующие сущность как единое целое, например:

    • поле имя уникально, затем используйте имя.
    • поле имя и число уникальны, затем используйте оба.
  2. Как только объект был создан, у вас не должно быть установщика для вашего поля Id. У вас может быть конструктор, в который вы его получите вместо использования в модульных тестах, но не сеттер. Неизменяемые объекты - хороший способ следовать, но если вы не можете, по крайней мере поле, идентифицирующее экземпляр, не должно измениться.

Надеюсь, что смогу помочь.

...