如何防止对象的多个实例在Java中具有相同的属性

时间:2019-03-14 05:24:11

标签: java oop

下面是我的代码段

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方法中有一种机制可以防止两个对象实例相同。

2 个答案:

答案 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对象中覆盖hashCodeAccount just 那样简单。通过在Account的两个不同实例上指定一个约束,这意味着两个实例彼此意识到。在这种情况下,它们不会成为现实。它们是两个独立的实例,实际上它们不应该彼此了解。

您需要做的就是提供某种客户经理服务,然后可以负责在帐户上设置昵称。

在这种情况下,您不必真的必须覆盖equalshashCode,因为那样也不会给您想要的东西。您将不会总是有两个昵称相同的其他相同帐户,并且混用equals方法来注意单个字段会感觉错误

第一件事-让我们从一个简单的客户经理开始。这利用了集合和流,为简洁起见,我将保留这些概念作为练习供读者使用。

机制很简单:

  • 如果我们有一个昵称的帐户,则不会更新。如果没有,我们将通过ID更新它。
  • 该服务现在负责创建和处理所有帐户。


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管理的任何帐户都将不能使用相同的昵称。