Netbeans正确创建“等于”方法吗?

时间:2019-06-19 08:48:59

标签: jpa netbeans hashcode

从数据库创建实体时,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方法中的自动递增ID吗?

3。。自然ID或公司ID应该完全不可变还是可以更改。我的意思是,我应该为此定义一个设置器方法吗?

1 个答案:

答案 0 :(得分:1)

[更新] 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中相同的字段。 在这里,尝试使用将实体标识为一个的字段,例如:

    • 名称字段是唯一的,然后使用名称。
    • 名称数字字段是唯一的,然后同时使用。
  2. 创建对象后,您就不应为ID字段添加设置器。您可以在其中收到构造函数,而不是在单元测试中使用该构造函数,而不能使用setter。不可变对象是遵循的好方法,但如果不能这样做,至少标识实例的字段不应更改。

希望我能帮上忙。