gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:25:39 25 4
gpt4 key购买 nike

我正在开发一个允许用户管理帐户的应用程序。所以,假设我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com