Как получить доступ к экземпляру класса A по типу взаимной переменной в классе B - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь написать метод в классе BankAccount, который выводит деньги со счета, используя только два параметра, являясь полем «пользователь» типа User (это класс, который содержит String username,поля String password, ArrayList<String> usernames) и «количество» типа double.

Класс BankAccount имеет поле accountOwner типа User и поле availableFunds типа double.Я пытаюсь выяснить, как найти / получить доступ к экземпляру класса BankAccount с помощью пользовательского параметра типа User.

Я новичок в Java и не понимаюкак вызвать экземпляр «BankAccount» только с помощью переменной типа «Пользователь».

Я пытался создать новый экземпляр BankAccount, но я не хочу этого делать, потому что я пытаюсь получить доступуже существующий экземпляр BankAccount.

Вот соответствующие методы и поля класса User:

public class User {
    static ArrayList<String> usernames = new ArrayList<String>();

    private String username;
    private String password;

    public String getUsername()
    {
        return username;
    }

Класс BankAccount:

public class BankAccount {

    private User accountOwner;
    private double availableFunds;

public double getFunds()
    {
        return availableFunds;
    }

public void deposit(double deposit)
    {
        availableFunds += deposit;
    }

Это метод, который я должен попробовать написать:

public void withdraw(User user, double withdrawal) throws UserException, FundsException
    {

    }

По сути, пользователь вводит пользователя User и удваивает сумму вывода, я должен вычесть сумму вывода из класса BankAccount, на который ссылается пользователь User каким-либо образом.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Ну, вам нужно сопоставить пользователя, которого вы перешли на банковский счет.Для этого можно использовать имя пользователя в качестве ключа карты, например, так:

Map<String, User> usersByName = new Hashmap<>();
Map<String, BankAccount> accountsByUsername = new Hashmap<>();

Затем вы заполняете карты, например, так:

BankAccount account = ...//you got it from somewhere
accountsByUsername.put( account.getUser().getUsername(), account);

При снятии средств вы получаете аккаунтчерез имя пользователя:

BankAccount account = accountsByUsername.get(user.getUsername());

В качестве альтернативы вы можете напрямую использовать User в качестве ключа карты, то есть Map<User, BankAccount>, но для этого вам необходимо выполнить несколько требований:

  • Реализуйте equals() и hashCode() для User, которые, вероятно, используют только свойство username
  • Сделайте все свойства User, которые используются в этих двух методах, неизменяемыми - ключи карты должны не разрешено изменять

Редактировать :

В ответ на ваш вопрос в комментарии, здесь есть 3 варианта того, как выможет получить учетную запись, если у вас есть только имя пользователя, но у вас есть Map<User, BankAccount> или просто Collection<BankAccount>:

  1. Если у вас есть Map<User, BankAccount>, вы можете выполнить поиск пользователяво-первых, то есть
    User user = usersByName.get(username); BankAccount account = accountsByUser.get(user);

  2. В качестве альтернативы вы можете использовать username в User.equals()User.hashCode()) aи создайте новый User экземпляр только для поиска:
    BankAccount account = accountsByUser.get(new User(username));

  3. Если у вас просто есть Collection<BankAccount>, вы можете перебрать все учетные записи и найти тот, чейимя пользователя владельца совпадает.При использовании потоков это может выглядеть так:

BankAccount account = accounts.stream()
    .filter(a -> a.getOwner().getUsername().equals(username))
    .findFirst()
    .orElse(null);
1 голос
/ 03 апреля 2019

См. Визуализируйте это с открытием реального банковского счета,

1) Вы создаете пользователя (проверяет ваш kyc, отправляя документы) 2) Создается банковский счет и один из пользователей, открывших счетстановится владельцем 3) Вы вносите средства на банковский счет, снимаете их ... и т. д.

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

Теперь метод вывода должен проверить, является ли пользователь правильным владельцем учетной записи или нет

//Create banaccount and user objects seperately

public void withdraw(BankAccount banAcc , User user, double withdrawal) throws UserException, FundsException
{
    if(!bankAcc.getUser()==user) {
        throw new AuthenticationException("User is not authorised to withdraw funds");
    }
    if(bankAcc.getAvailableFunds < withdrawal) {
        throw new FundsException("Insufficient funds");
    }
    bankAcc.setAvailableFunds(bankAcc.getAvailableFunds-withdrawal);
}
...