从数据库创建实体时,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应该完全不可变还是可以更改。我的意思是,我应该为此定义一个设置器方法吗?
答案 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;
}
关于hashCode方法,最好使用与equals中相同的字段。 在这里,尝试使用将实体标识为一个的字段,例如:
创建对象后,您就不应为ID字段添加设置器。您可以在其中收到构造函数,而不是在单元测试中使用该构造函数,而不能使用setter。不可变对象是遵循的好方法,但如果不能这样做,至少标识实例的字段不应更改。
希望我能帮上忙。