Создайте простой банк со счетами на Java

У меня есть два интерфейса Bank и Account, которые имеют некоторые функции:

public interface Bank {
    String createAccount(String owner) throws IOException;
    boolean closeAccount(String number) throws IOException;
    Set<String> getAccountNumbers() throws IOException;
    Account getAccount(String number) throws IOException;
    void transfer(Account a, Account b, double amount) throws IOException, IllegalArgumentException, OverdrawException, InactiveException;
}
public interface Account {
    String getNumber() throws IOException;
    String getOwner() throws IOException;
    boolean isActive() throws IOException;
    void deposit(double amount) throws IOException, IllegalArgumentException, InactiveException;
    void withdraw(double amount) throws IOException, IllegalArgumentException, OverdrawException, InactiveException;
    double getBalance() throws IOException;
}

У меня есть класс Driver, который имеет два внутренних класса Bank и Account, которые реализуют интерфейсы выше, у банка есть HashMap в качестве учетных записей клиентов, а клиент может иметь несколько учетных записей с разными номерами счетов. Проблема, которую я не смог решить, это создание нескольких номеров счетов для каждого клиента !!! :

    public class Driver {
        private Bank bank = null;
        static class Bank implements Bank {
            private final Map<String, Account> accounts = new HashMap<>();
            @Override
            public Set<String> getAccountNumbers() {
                return accounts.keySet();
            }
            @Override
            public String createAccount(String owner) {
                //TODO create new Account and return the account number
            }

            @Override
            public boolean closeAccount(String number) {
                //TODO if the account isActive and balance is zero then set it as inactive and return true.
                return false;
            }

            @Override
            public bank.Account getAccount(String number) {
                return accounts.get(number);
            }

            @Override
            public void transfer(bank.Account from, bank.Account to, double amount)
                    throws IOException, InactiveException, OverdrawException {
                if (amount <= from.getBalance()) {
                    from.withdraw(amount);
                    to.deposit(amount);
                }
        }

        static class Account implements Account {
            private String number;
            private String owner;
            private double balance;
            private boolean active = true;

            Account(String owner) {
                this.owner = owner;
                //TODO set the account number ??? 
            }

            @Override
            public double getBalance() {
                return balance;
            }

            @Override
            public String getOwner() {
                return owner;
            }

            @Override
            public String getNumber() {
                return number;
            }

            @Override
            public boolean isActive() {
                return active;
            }

            @Override
            public void deposit(double amount) throws InactiveException {
                if (!isActive())
                    throw new InactiveException();
                if (amount < 0)
                    throw new IllegalArgumentException();
                balance += amount;
            }

            @Override
            public void withdraw(double amount) throws InactiveException, OverdrawException {
                if (!isActive())
                    throw new InactiveException();
                if (amount > balance)
                    throw new OverdrawException();
                if (amount < 0)
                    throw new IllegalArgumentException();
                balance -= amount;
            }
        }
}

Как сгенерировать номера счетов? Существует HashMap со всеми существующими счетами в банке. У клиента может быть несколько учетных записей с разными номерами счетов! Как это работает !?


person KIA    schedule 02.03.2018    source источник
comment
Где вы храните данные, используете ли вы какую-то базу данных?   -  person NiVeR    schedule 03.03.2018
comment
Подсказка: используйте static int и увеличивайте его ....   -  person Stephen C    schedule 03.03.2018
comment
Нет, я не использую никакой базы данных! учетные записи будут созданы во время работы кода!   -  person KIA    schedule 03.03.2018
comment
он работает со статическим int для разных клиентов?   -  person KIA    schedule 03.03.2018
comment
Он имеет в виду, что вы должны использовать один счетчик (static может гарантировать это) для извлечения уникальных идентификаторов из. Таким образом, первая учетная запись получает идентификатор 1, следующая - идентификатор 2 и так далее. Банк может иметь этот счетчик и предоставлять идентификаторы для новых счетов. После этого учетная запись связывается с номером, и впоследствии числа увеличиваются.   -  person Zabuzard    schedule 03.03.2018


Ответы (1)


Ваш Bank класс может предоставить эту функцию, имея внутри счетчик. Это будет работать, поскольку все счета обслуживаются только этим одним банковским объектом и не передаются другим пользователям.

Если пользователь запрашивает счет, банк выдаст ему номер, отображаемый на счетчике в данный момент, а затем увеличит счетчик. Таким образом, следующий запрос получит другой номер.

Может выглядеть как

public class Bank {
    private int nextAccountId = 1;

    public int createAccount(String owner) {
        // Get account ID
        int accountId = getUniqueAccountId();

        // Create account
        ...

        return accountID;
    }

    private int getUniqueAccountId() {
        int accountId = nextAccountId;
        // Increment ID for next request
        nextAccountId++;

        return accountId;

        // Method can be made compact by just using
        // return nextAccountId++;
    }
}

Очевидно, у этого есть недостатки. Он ограничен диапазоном int (около 4-х учетных записей Mrd, конечно, можно расширить с помощью long). Пользователи также могут видеть, сколько счетов у банка уже есть. А действительный идентификатор учетной записи другого пользователя легко угадать.

Для более случайного подхода вы можете использовать

String uniqueID = UUID.randomUUID().toString();

см. здесь для получения дополнительной информации.

person Zabuzard    schedule 02.03.2018