如何通过Class B中的互变量类型访问Class A的实例

时间:2019-04-03 11:12:37

标签: java class arraylist

我正在尝试在BankAccount类中编写一种方法,该方法仅使用两个参数从类型为User的“用户”字段中取款(该类包含一个String usernameString passwordArrayList<String> usernames)和类型为double的“ amount”字段。

BankAccount类具有用户类型的accountOwner字段和类型availableFunds的{​​{1}}字段。我试图找出如何通过类型为double的用户参数来查找/访问BankAccount类的实例。

我是Java的新手,我不理解如何仅通过用户类型变量来调用“ BankAccount”的实例。

我尝试创建一个新的User实例,但是我不想这样做,因为我试图访问BankAccount的现有实例。

以下是User类的相关方法和字段:

BankAccount

BankAccount类:

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

    private String username;
    private String password;

    public String getUsername()
    {
        return username;
    }

这是我必须尝试编写的方法:

public class BankAccount {

    private User accountOwner;
    private double availableFunds;

public double getFunds()
    {
        return availableFunds;
    }

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

基本上,用户输入了User用户并提取了两倍的提款额,我必须从以某种方式使用User用户引用的BankAccount类中扣除提款额。

2 个答案:

答案 0 :(得分:2)

那么您需要将您传递的用户映射到银行帐户。为此,可以使用用户名作为映射键,例如像这样:

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的所有属性设为不可变-不应 更改地图键

修改

在评论中回答您的问题,以下三种方法可以解决如果您只有用户名但只有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()并创建一个仅用于查找的新User实例:
    { {1}}

  3. 如果您只有BankAccount account = accountsByUser.get(new User(username));,则可以遍历所有帐户并查找与所有者的用户名匹配的帐户。使用流可能看起来像这样:

Collection<BankAccount>

答案 1 :(得分:1)

通过真实的银行帐户查看将其可视化,

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);
}