下面是我的代码段
Account acc1 = new Account ("123", "James", "Savings");
Account acc2 = new Account ("234", "James", "Checking");
acc1.setNickName("James Account");
acc2.setNickName("James Account");
//Nick Name Method
private String nickName;
public void setNickName (String name)
{
nickname = name;
}
我的问题是如何防止acc2
对象的NickName值与acc1
相同?
我想确保在setNickName
方法中有一种机制可以防止两个对象实例相同。
答案 0 :(得分:4)
您可以在{% regroup object_list by category as category_list %}
<ul>
{% for category in category_list %}
<li>{{ category.grouper }}
<ul>
{% for position in category.list %}
<li>{{ position.title }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
类中创建一个静态Set
对象,并且每次添加Account
时,都要检查是否已经存在一个对象。如果不是,则设置该值。如果不存在,那么您可以拥有自己的逻辑(我抛出了nickname
)
IllegalArgumentException
如@Makoto所指出的,在class Account {
private static Set<String> nickNameSet = new HashSet<>();
public void setNickName(String nickName) {
if(nickNameSet.add(nickName))
{
this.nickName = nickName;
}
else {
throw new IllegalArgumentException("Nick Name already exists");
}
}
}
类中定义Set
对象将导致所有帐户对象都可以访问其他帐户的昵称。如果您担心数据隐藏,我们应该创建一个新的类Account
,并具有识别重复的AccountManager
的逻辑。
答案 1 :(得分:3)
这不像在您的equals
对象中覆盖hashCode
或Account
的 just 那样简单。通过在Account
的两个不同实例上指定一个约束,这意味着两个实例彼此意识到。在这种情况下,它们不会成为现实。它们是两个独立的实例,实际上它们不应该彼此了解。
您需要做的就是提供某种客户经理服务,然后可以负责在帐户上设置昵称。
在这种情况下,您不必真的必须覆盖equals
或hashCode
,因为那样也不会给您想要的东西。您将不会总是有两个昵称相同的其他相同帐户,并且混用equals
方法来注意单个字段会感觉错误。
第一件事-让我们从一个简单的客户经理开始。这利用了集合和流,为简洁起见,我将保留这些概念作为练习供读者使用。
机制很简单:
public class AccountManager {
final List<Account> accounts = new ArrayList<>();
public Account createAccount(String id, String name, String type) {
Account account = new Account(id, name, type);
accounts.add(account);
return account;
}
public boolean setNickName(String id, String nickName) {
Optional<Account> existingAccount = accounts.stream()
.firstMatch(a -> a.getNickName().equals(nickName));
if(existingAccount.isPresent()) {
return false; // don't allow modification to an account who has the same nickname
} else {
accounts.stream()
.firstMatch(a -> a.getId().equals(id))
.ifPresent(a -> a.setNickName(nickName));
return true;
}
}
}
现在,使用此类,您应该会得到想要的-由AccountManager
管理的任何帐户都将不能使用相同的昵称。