Это не так просто, как , просто переопределение 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
, не сможет иметь такой же псевдоним.