Как я могу предотвратить несколько экземпляров объекта иметь одинаковые атрибуты в Java - PullRequest
1 голос
/ 14 марта 2019

Ниже приведен фрагмент моего кода

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 ]

4 голосов
/ 14 марта 2019

Вы можете создать статический объект Set в своем классе Account, и каждый раз, когда добавляется 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, определяя объект Set в AccountКласс приведет к тому, что все объекты учетной записи будут иметь доступ к псевдонимам других учетных записей.Если ваша задача - скрыть данные, мы должны создать новый класс, скажем AccountManager, и иметь логику определения дубликатов nickName, делегированных ему.

3 голосов
/ 14 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...