【问题标题】:How to access an instance of Class A by a mutual variable type in Class B如何通过 B 类中的互变量类型访问 A 类的实例
【发布时间】:2019-04-03 11:12:37
【问题描述】:

我正在尝试在BankAccount 类中编写一个从帐户中提取资金的方法,它只有两个参数,即User 类型的“用户”字段(这是一个包含String username 的类,和一个String password,和一个ArrayList<String> usernames),以及双精度类型的“金额”字段。

BankAccount 类有一个 User 类型的 accountOwner 字段和一个 double 类型的 availableFunds 字段。我试图弄清楚如何通过User 类型的用户参数查找/访问BankAccount 类的实例。

我是 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 用户和双倍提款金额,我必须从使用 User 用户以某种方式引用的 BankAccount 类中扣除提款金额。

【问题讨论】:

  • 如果您想通过User 对象访问BankAccount,您必须在User 类中声明一个新字段,例如BankAccount userAccount;,并为其赋值(假设用户只有一个银行账户)。
  • 大家好,感谢您的 cmets,如果有帮助,我想我应该确定 BankAccount 的“accountOwner”与银行帐户用户的“用户名”相同。

标签: java class arraylist


【解决方案1】:

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

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&lt;User, BankAccount&gt;,但您必须满足一些要求:

  • User 实现equals()hashCode(),这可能只使用username 属性
  • 使在这 2 种方法中使用的 User 的所有属性不可变 - 应不允许更改映射键

编辑

针对您在评论中提出的问题,如果您只有用户名但有 Map&lt;User, BankAccount&gt; 或只有 Collection&lt;BankAccount&gt;,则有 3 种可能的方法来获取帐户:

  1. 如果您有Map&lt;User, BankAccount&gt;,您可以先查找用户,即
    User user = usersByName.get(username); BankAccount account = accountsByUser.get(user);

  2. 或者,您只能在 User.equals()(和 User.hashCode())中使用 username 并创建一个新的 User 实例以供查找:
    BankAccount account = accountsByUser.get(new User(username));

  3. 如果您只有Collection&lt;BankAccount&gt;,您可以遍历所有帐户并查找其所有者用户名匹配的帐户。使用流可能如下所示:

BankAccount account = accounts.stream()
    .filter(a -> a.getOwner().getUsername().equals(username))
    .findFirst()
    .orElse(null);

【讨论】:

  • 我发现您的方法存在问题,因为 Map 将不起作用,因为用户可以拥有多个银行帐户。仍然 +1 以突出显示其他内容
  • 请查看我的回答并尝试突出显示是否有错误,然后将两者结合起来作为解决方案
  • @Ravi 是的,尽管 OP 的方法在这种情况下无论如何都不起作用 - 如果用户有多个帐户,哪个帐户将用于提款?
  • 是的,这就是为什么我建议提款方法应该有一个参数作为银行账户,并且根据用户我们可以验证它是否被授权,我的回答中也强调了这一点
  • @Ravi 好吧,OP 没有说明用户可以拥有多个帐户 - 实际上“这是我必须尝试编写的方法”表示方法签名已给出并且可以'因此,t 被更改隐含地表明用户和帐户之间的 1:1 关系。
【解决方案2】:

用真实的银行开户看一下,

1)您创建一个用户,(通过提交文件来验证您的 kyc) 2) 创建一个银行账户,开户的用户之一成为所有者 3)您将资金存入银行帐户,提取它......等等

因此,提款操作现在应该从哪个账户中提取资金以及哪个用户正在提取资金。

现在,withdraw 方法应该验证用户是否是帐户的正确所有者

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多