[英]JAVA - How to copy attributes of an object to another object having the same attributes?
[英]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
的逻辑。
它并不像重写简单equals
或hashCode
在您Account
对象。 通过在两个不同的实例指定约束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
管理的任何帐户都将不能使用相同的昵称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.