首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是相等合同的重要字段(有效的java项目8)?

什么是相等合同的重要字段(有效的java项目8)?
EN

Stack Overflow用户
提问于 2019-08-25 21:07:04
回答 2查看 315关注 0票数 3

在第8项中,有效的Java建议是

对于类中的每个重要字段,检查该对象的相应字段。

我知道我们可以有由主字段计算的次要字段,但“对于每个重要字段”的确切含义是什么?只有在比较对象的所有字段时,equals契约才能正确地实现吗?

如果我有一个Employee类,它有很多字段,如id、姓氏、道布、位置、位置等等,这一切对我来说都很重要,但对我来说,仅仅使用id似乎就足以实现一个正确的、具有表现力的equals实现。

我做错了吗?或者我提到的id正是Bloch所说的“重要”字段的含义?

EN

回答 2

Stack Overflow用户

发布于 2019-08-25 21:17:54

代码语言:javascript
复制
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中的firstNamelastName;根据数据对象比较,只有id字段才是有效

票数 0
EN

Stack Overflow用户

发布于 2019-08-25 21:18:14

一个重要的字段只是一个,如果省略了它,就会导致equals的不正确实现(根据您为类实例定义的平等概念)。

我理解这是一个自我参照的定义,但这就是它的意思。

非重要字段的典型示例是String.hashCode:正如您所观察到的,这是从其他字段(并且是懒惰的)计算出来的,所以在等式中包含是不合适的,因为不能保证它是为正在比较的任何一个字符串计算的;而且,如果计算了这两个字段,它只告诉您已经知道的内容。

在您的例子中,是的,听起来只使用id来比较实例就足够了:这是一个重要的字段,名称(etc)不重要:应该只有一个人(小p,就像在实际的人中那样)具有特定的id。

这确实引发了一个问题,您将如何处理“相同id,不同名称”实例,但这将进入错误的程序员相信名字领域。

  1. 人们只有一个标准的全名。
  2. 人们只有一个全名。
  3. 在这个时候,人们有一个标准的全名。
  4. 在这个时候,人们有一个全名。
  5. 对于N的任何值,人们都有确切的N个名字。
  6. (人名在一定的空间范围内。)
  7. 人的名字是不变的。
  8. ..。

考虑到这些因素,如果您想说“这个人和那个人一样”(并且您想使用equals),那么id似乎是唯一合理使用的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57649718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档