java - 我应该比较我类(class)的 "equals"方法中的所有字段吗?

标签 java equals

我正在开发一个允许用户管理帐户的应用程序。所以,假设我有一个 Account 类,代表一个用户的帐户:

class Account
{
    public int id;
    public String accountName;
    public String accountIdentifier;
    public String server;
    public String notes;
}

我的 equals 方法如下所示:

public boolean equals(Object o)
{
    if (this == o)
        return true;
    if (o == null || !(o instanceof Account))
        return false;

    Account other = (Account) o;
    if (!accountIdentifier.equals(other.accountIdentifier))
        return false;
    if (!server.equals(other.server))
        return false;
    return true;
}

如您所见,我只比较了 accountIdentifierserver,没有比较其他字段。我选择这种方法有几个原因。

  1. 我将帐户保存在 List 中。当用户更新帐户时,通过更改帐户名称(这只是用户指定的用于标识帐户的名称)或注释,我可以执行 accountList.set(accountList.indexOf(account), account) ; 更新列表中的帐户。如果 equals 比较所有属性,这种方法将不起作用,我必须解决它(例如,遍历列表并手动检查这些属性)。
  2. 这实际上可能更重要,但我只是想了一会儿才想到的。 AccountaccountIdentifier 和它所属的 server 唯一标识。用户可能决定重命名帐户或更改注释,但它仍然是同一个帐户。但是如果服务器改变了,我想我会认为它是一个不同的帐户。 id 只是一个内部 ID,因为帐户存储在数据库中。即使更改了,如果 accountIdentifierserver 保持不变,该帐户仍被视为同一帐户。

我想说的是,我基本上以这种方式实现了 equals,以便在应用程序的其余部分使用更短、更简洁的代码。但是我不确定我是否违反了这里的一些规则,或者如果碰巧有人在使用我的应用程序的 API,我是否正在做一些可能会让其他开发人员头疼的事情。

equals 方法中只比较部分字段是否可以,还是应该比较所有字段?

最佳答案

是的,这样做绝对没问题。 可以决定相等对于您的类意味着什么,并且您应该以对您的应用程序逻辑最有意义的方式使用它——特别是对于集合和其他使用相等的类.听起来您已经考虑过这一点并决定 (server, identifier) 对是唯一区分实例的东西。

这意味着,例如,具有相同 (server, identifier) 对但不同 accountName 的两个实例是同一 Account 的不同版本,并且可能需要以某种方式解决差异;这是一个完全合理的语义。

定义一个单独的 boolean allFieldsEqual(Account other) 方法来覆盖“扩展”定义可能是有意义的,这取决于您是否需要它(或者会发现它对测试有用)。

当然,您应该覆盖 hashCode to make it consistent无论您使用什么 equals 定义。

关于java - 我应该比较我类(class)的 "equals"方法中的所有字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32062135/

相关文章:

java - 使用 Comparator 而不是 equals() 来比较两个 Java 集合

c# - Object.Equals(obj1, obj2) vs obj1.Equals(obj2)?

Java - 是否有像 instanceof 这样的 "subclassof"?

java - 无法在应用于 AJAX 的多个类上设置 CSS

java - Lombok:等于子类中的字符串实例变量

Java:ArrayList 给出乱码结果

java - Spring JPA 存储库转换器未找到

java - 为抽象类实现 clone()、equals() 或 hashCode() 是否有意义?

java - 在 Java 泛型中,List<? super String> 是什么意思?

java - Java 中的 ImageIcon 更新(来自互联网)?