繁体   English   中英

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

[英]How can I prevent multiple instances of an object from having the same attributes in Java

以下是我的代码段

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对象的acc2值与acc1相同?

我想确保在setNickName方法中有一种机制可以防止两个对象实例相同。

您可以在Account类中创建一个静态Set对象,并且每次添加一个nickname ,都要检查是否已经存在一个nickname 如果不是,则设置该值。 如果不存在,那么您可以拥有自己的逻辑(我抛出了IllegalArgumentException

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");
    }
  }
}

正如@Makoto指出的那样,在Account类中定义Set对象将导致所有帐户对象都可以访问其他帐户的昵称。 如果您担心数据隐藏,我们应该创建一个新类,即AccountManager并具有标识重复的nickName的逻辑。

它并不重写简单equalshashCode在您Account对象。 通过在两个不同的实例指定约束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管理的任何帐户都将不能使用相同的昵称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM