java - 什么是 equals 合约的重要字段(有效的 java item 8)
问题描述
在第 8 项的有效 Java 中,建议是
对类中的每个重要字段检查this对象的对应字段。
我知道我们可以拥有由主要字段计算的辅助字段,但是“对于每个重要字段”的确切含义是什么?仅当比较对象的所有字段 时,equals
合同是否正确执行?
例如,如果我有一个类Employee
,它有多个字段,如 id、名字和姓氏、dob、位置、位置等,所有这些似乎都很重要,但对我来说,似乎只使用id
就足以实现正确和高性能的equals
实现。
我错了吗?或者id
我提到的正是布洛赫所说的“重要”领域?
解决方案
class Employee {
private UUID id;
private String firstName;
private String lastName;
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof Employee))
return false;
return id.equals(((Employee)obj).id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
如果 ofEmployee
存储到 DB 中,即 has unique id
,则无需检查其他字段,如firstName
and lastName
in equals
;根据数据对象比较,只有id
归档是显着的。
推荐阅读
- python - Python自然分布图
- reactjs - 在 React setState() 中,如何重新填充数组?
- es6-class - 如何在 ES6 中禁用此错误?错误:在派生类构造函数中调用 super 之前无法引用“this”
- javascript - Recursive function to return random element in an array returning undefined
- c# - MVC 通过导航属性修改 EF 数据
- ruby - 是否可以将 if 语句重构为布尔运算符,例如 !=、==、&& 和 ||?
- cassandra - cqlsh 命令无法通过 Ansible 工作
- java - spring boot 注册组件失败并返回 404
- bash - 我尝试安装软件包后,Anaconda 停止工作,但 jupyter notebook 仍然有效
- java - foreach 循环字符串将数字相乘