【问题标题】:JAVA - relation between two objectsJAVA - 两个对象之间的关系
【发布时间】:2015-02-07 12:43:49
【问题描述】:

我对 OOP 和 Java 还是很陌生,有一个问题可能很简单,但我在网上找不到答案。

我正在用 Java 编写标准银行账户程序 - 一个有客户的程序,每个客户都有银行账户(一个客户可能有多个银行账户!),我可以存款或取款。每个银行账户都有一个唯一的号码(即使某人有多个银行账户,每个银行账户都有唯一的号码)

我的代码编译成功,存款和取款操作正常。

问题如下 - 我不能将多个银行帐户归于一个客户,在我的程序中,客户只能拥有一个银行,但不能超过一个银行帐户。

我有 3 个类 - Account、Client、BankMain。你可以在下面看到它们

public class Account {
    private int balance;
    private String NumAccount; // each bank account has a unique number

    public Account(int money, String num) {
        balance = money;
        NumAccount = num;
    }

    public String printAccountNumber() {
        return NumAccount;
    }
    // below are the methods for withdraw,deposit- they are working properly
}

类客户端

public class Client {
    private String name;// name of the client
    private Account account;

    // the account associated to the client. Probably I should change sth
    // here
    // but I don't know what
    public Client(String nom, Compte c) {
        name = nom;
        account = c;
    }

    public void printName() {
        System.out.println(
                "Name: " + name 
                + "\nAccount number: " + account.printAccountNumber() 
                + "\nSolde: " + account.printBalance() + "\n"
        );
    }
}

和BankMain

public class BankMain {

    public static void main(String[] args) {
        Account account1 = new Account(1000, "11223A");
        Account account2 = new Account(10000, "11111A");
        Client client1 = new Client("George", account1);
        Client client2 = new Client("Oliver", account2);
        // now this is working correctly
        client1.printName();
        client2.ptintName();
        /*
         * The problem is that I don't know what to do if I want account1
         * and account2 to belong both to client1. I tried Client client1 =
         * new Client("George",account1); Client client1 = new
         * Client("Oliver", account2); but got compilation error
         */
    }
}

你知道我该如何解决这个问题吗?我应该怎么做才能让多个银行账户关联到同一个客户?

提前致谢 乔治

【问题讨论】:

    标签: java class object


    【解决方案1】:

    查看此代码:

    //Account
    
    public class Account
    {
        private int balance;
        private String accNo;
    
        public Account(int money,String num) {
        balance = money;
        accNo = num;
    }
    
    public int getBalance() {
            return balance;
        }
    
    public void setBalance(int balance) {
        this.balance = balance;
    }
    
    public String getAccNo() {
        return accNo;
    }
    
    public void setAccNo(String accNo) {
        this.accNo = accNo;
    }
    

    }

    //Client 
    
    import java.util.ArrayList;
    import java.util.Collection;
    
    public class Client 
    {
        private String clientName;
        private HashSet<Account> accounts;
    public Client(String name)
    {
        this.clientName = name;
        this.accounts = new HashSet<Account>();
    }
    
    public void addAccount(Account account) {
    
        accounts.add(account);
    }
    
    public String getClientName() {
        return clientName;
    }
    
    public void setClientName(String clientName) {
        this.clientName = clientName;
    }
    
    public Collection<Account> getAccounts() {
        return accounts;
    }
    
    public void setAccounts(HashSet<Account> accounts) {
        this.accounts = accounts;
    }
    
    public void printAccountDetails() {
    
        System.out.println("Account details :");
        int counter= 0;
        for(Account acc : accounts) {
            counter ++;
            System.out.println("Account details for Account '"+counter+"' :\n");
            System.out.println("Account Number : "+ acc.getAccNo() +" Balance :" + acc.getBalance() );
        }
    }
    

    }

    // Bank class
    
    
     public class BankMain {
    
        public static void main(String[] args) 
        {
    
            Account account1 = new Account(1000,"11223A");
            Account account2 = new Account(10000,"11111A");
            Client client = new Client("George");
    
            client.addAccount(account1);
            client.addAccount(account2);
    
            client.printAccountDetails();
        }
    
    }
    

    您可以在此处添加任意数量的帐户。

    【讨论】:

    • 这里是输出:Account details : Account details for Account '1' : Account Number : 11223A Balance :1000 Account details for Account '2' : Account Number : 11111A Balance :10000
    • 好的,谢谢,它工作正常,但我不明白为什么我们需要使用 HashSet?为什么它不能只与 Set 一起使用?
    • 设置是更好的选择。它不必是 HashSet。两者的区别在于 Set 是一个接口,而 HashSet 是具体的类。您不能创建接口的实例。
    【解决方案2】:

    您可以为一个客户拥有多个帐户,更改Client 类中的数据类型。例如:

    private Map<String, Account> accounts;
    

    其中map的key是账号,value是账号本身。这样您就可以通过其唯一编号访问每个帐户。

    (如果您不知道地图是什么,请查看this

    这也意味着您需要修改 Client 构造函数以接受多个帐户,或者添加新方法以将新帐户添加到 Client

    【讨论】:

    • 这是解决问题的另一种有趣的方法。
    • 有没有更简单的方法可以将一个客户与多个银行账户关联起来?例如,是否可以在 Client 类中创建一个 Accounts 数组?如果是,我该怎么做?提前谢谢你,乔治
    • 地图是一种简单的数据结构。事实上你可以把它想象成一个数组:每个索引(键)都有一个值。可以有一个数组,但在 Java 中很少使用数组,因为通常有更好的数据结构可以满足您的需求。如果您以后需要检索这些帐户,您将如何处理数组?您必须遍历所有数组,直到找到所需的帐户。使用映射时,您只需向映射询问具有关联键的值(在本例中为帐号,这是一个合适的键,因为它在所有帐户中都是唯一的)。
    【解决方案3】:

    正如@m0skit0 建议的那样,使用地图或列表来保存 Client 类下的 Account 对象。

    public class Client 
    {
        private String name;//name of the client
        private List<Account> accounts = new ArrayList<Account>();
    
        public Client(String nom, Account c)
        {
            name = nom;
            accounts.add (c);
        }
    
        public boolean addAccount (Account c) 
        {
            return accounts.add (c);
        }
        public removeAccount (Account c)
        {
            final int accountIndex = accounts.indexOf (c);
            if (accountIndex > 0)
            {
                accounts.remove (accountIndex);
                return true;
            }
            return false;
        }
    
        public void printName()
        {
            System.out.println("Name: " + name);
            System.out.println ("Total Accounts: " + accounts.size());
            for (int i=0; i<accounts.size(); i++)
            {
                 final Account a = accounts.get(i);
                 System.out.println ("\tAccount Number: " + a.printAccountNumber());
                 System.out.println ("\tAccount Balance: " + a.printBalance());
            }        
        }
    }
    

    并在您的 BankMain.java 中使用它

    Account account1 = new Account(1000,"11223A");
    Account account2 = new Account(10000,"11111A");
    Client client1 = new Client("George", account1);
    client1.addAccount (account2);
    
    client1.printName();
    

    【讨论】:

    • 我宁愿使用 Set 来进行数据完整性检查,我认为帐户顺序没有任何意义。只是我的意见。
    【解决方案4】:

    而不是像这样尝试重新定义 client1 和 2:

    Client client1 = new Client("George",account1);
    Client client1 = new Client("Oliver", account2);
    

    将这些对象重新定义为:

     client1 = new Client("George",account1);
     ...
     client1 = new Client("Oliver", account2);
    

    但是这样做,您可以在同一个帐户上操作,即如果您现在执行 client1.withdraw,您将从 Oliver 的帐户中撤出,而不是 George。

    您可以不这样做,而是在地图中维护名称和帐户对象,并给定名称,您可以随时获取该人的帐户。喜欢:

    Map<String, Account> nameAccountMap = ..
    

    然后你添加相应的帐户,如:

    nameAccountMap.put("Oliver", account2);
    nameAccountMap.put("George",account1);
    

    现在,如果您希望对 Oliver 拥有的帐户进行操作,您可以通过以下方式进行操作:

    nameAccountMap.get("Oliver").withdraw...
    

    以及对其他账户持有人的类似操作。

    如果您希望将多个帐户与一个用户关联,您可以使用用户持有的帐户名称和列表维护地图,例如:

        Map<String, List<Account>> nameAccountMap = ..
    

    【讨论】:

    • 我怀疑这就是 OP 正在寻找的答案。
    • 问题是如何为一个客户拥有多个帐户。
    • 有多个问题。 1.Client client1 = new Client("George",account1); Client client1 = new Client("Oliver", account2); but got compilation error OP 在代码中提到。你知道我该如何解决这个问题吗? 2. >> 我应该怎么做才能让多个银行账户关联到同一个客户?所以这是两者的答案。
    • 是的,这是真的,但我正在编辑中,我看到了你和 sid 的评论;)
    【解决方案5】:

    不要在您的 Client 类中使用单个 Account,而是使用 Set&lt;Account&gt; 以便建立一对多关系。确保 Account 类已实现 equalshashcode

    public class Client 
    {
        private String name;//name of the client
        private Set<Account> accounts;
     //the account associated to the client. Probably I should change sth here
     // but I don't know what
        public Client(String nom, Set<Account> c)
        {
            name = nom;
            account = c;
        }
        public String getName()
        {
            return this.name;
        }
    
       public Set<Account> getAccounts()
       {
           return this.accounts;
       }
       public String toString()
       {
           ...
           // Return description of the Object state
       }
    }
    
    
    
    
    
    public class Account
    {
        private int balance;
        private String NumAccount; //each bank account has a unique number
        public Account(int money,String num)
        {
            balance = money;
            NumAccount = num;
        }
        public String getAccountNumber()
       {
            return NumAccount;
       }
       public boolean equals(..)
       {
           ...
       }
       public int hashcode()
       {
          ...
       }
       public String toString()
       {
           ...
           // Return description of the Object state
       }
        // below are the methods for withdraw,deposit- they are working properly
    }
    

    【讨论】:

    • 有没有更简单的方法可以将一个客户与多个银行账户关联起来?例如,是否可以在 Client 类中创建一个 Accounts 数组?如果是,我该怎么做?提前谢谢你
    • 你可以有一个数组,但在我看来,一个集合会更合适。但是是的,Account 对象的数组是可能的。
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多