在第8项中,有效的Java建议是
对于类中的每个重要字段,检查该对象的相应字段。
我知道我们可以有由主字段计算的次要字段,但“对于每个重要字段”的确切含义是什么?只有在比较对象的所有字段时,equals契约才能正确地实现吗?
如果我有一个Employee类,它有很多字段,如id、姓氏、道布、位置、位置等等,这一切对我来说都很重要,但对我来说,仅仅使用id似乎就足以实现一个正确的、具有表现力的equals实现。
我做错了吗?或者我提到的id正是Bloch所说的“重要”字段的含义?
发布于 2019-08-25 21:17:54
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);
}
}如果将Employee存储到DB中,即有unique id,则无需检查其他字段,如equals中的firstName和lastName;根据数据对象比较,只有id字段才是有效。
发布于 2019-08-25 21:18:14
一个重要的字段只是一个,如果省略了它,就会导致equals的不正确实现(根据您为类实例定义的平等概念)。
我理解这是一个自我参照的定义,但这就是它的意思。
非重要字段的典型示例是String.hashCode:正如您所观察到的,这是从其他字段(并且是懒惰的)计算出来的,所以在等式中包含是不合适的,因为不能保证它是为正在比较的任何一个字符串计算的;而且,如果计算了这两个字段,它只告诉您已经知道的内容。
在您的例子中,是的,听起来只使用id来比较实例就足够了:这是一个重要的字段,名称(etc)不重要:应该只有一个人(小p,就像在实际的人中那样)具有特定的id。
这确实引发了一个问题,您将如何处理“相同id,不同名称”实例,但这将进入错误的程序员相信名字领域。
考虑到这些因素,如果您想说“这个人和那个人一样”(并且您想使用equals),那么id似乎是唯一合理使用的东西。
https://stackoverflow.com/questions/57649718
复制相似问题