Netbeans Create "equals" 方法是否正确?

does Netbeans Create "equals" method correctlly?

从数据库创建实体时,Netbeans 会创建 equals 方法:

    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))
               );
    }

return声明根据:

~((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 方法 中使用自动递增 ID 吗?

3. Natural Id 或 business id 应该完全不可变还是可以更改。我的意思是,我应该为它定义一个 setter 方法 吗?

[更新] Netbeans 正确创建了方法,如您所见,它使用了!在比较中,这就是他使用 OR 和 !equals 的原因:

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 方法,最好使用与 equals 中相同的字段。 这里,尽量使用标识实体为一个的字段,例如:

    • 字段name是唯一的,那就用name.
    • 字段namenumber是唯一的,然后两者都使用。
  2. 创建对象后,您的 Id 字段不应有 setter。您可以在接收它的地方有一个构造函数,而不是在单元测试中使用,而不是 setter。不可变对象是一个很好的遵循方法,但如果不能,至少标识实例的字段不应更改。

希望我能帮到你。