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;
}
关于 hashCode 方法,最好使用与 equals 中相同的字段。
这里,尽量使用标识实体为一个的字段,例如:
- 字段name是唯一的,那就用name.
- 字段name和number是唯一的,然后两者都使用。
创建对象后,您的 Id 字段不应有 setter。您可以在接收它的地方有一个构造函数,而不是在单元测试中使用,而不是 setter。不可变对象是一个很好的遵循方法,但如果不能,至少标识实例的字段不应更改。
希望我能帮到你。
从数据库创建实体时,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;
}
关于 hashCode 方法,最好使用与 equals 中相同的字段。 这里,尽量使用标识实体为一个的字段,例如:
- 字段name是唯一的,那就用name.
- 字段name和number是唯一的,然后两者都使用。
创建对象后,您的 Id 字段不应有 setter。您可以在接收它的地方有一个构造函数,而不是在单元测试中使用,而不是 setter。不可变对象是一个很好的遵循方法,但如果不能,至少标识实例的字段不应更改。
希望我能帮到你。