两个arrayLists,每个对象都有自己的List

时间:2014-10-13 13:17:46

标签: java arraylist

我绝对不知道如何在这里实现我想要的东西。因此,我希望我创建的每个客户都有自己的帐号列表,但我似乎没有让它正常工作,因为看起来每个客户都没有一个独特的" accountList" 。任何提示或指示?提前谢谢!

Bank.java

List<Customer> customerList = new ArrayList<Customer>();
case 1:
// creates a new customer, adds customer to arraylist
    System.out.println("Type name:");
    String firstname = input.next();

    System.out.println("Type surname:");
    String surname = input.next();

    System.out.println("Type your social security number:");
    ssn = input.next();

    System.out.println("Input account number: ");
    String accNo = input.next();

    Account account = new Account(accNo);
    Customer newCustomer = new Customer(firstname,
    surname, ssn, account);
    customerList.add(newCustomer);

Customer.java

public class Customer {
    public List<Account> accountList;
    private String firstname, surname, ssn;
    Account account;

    public Customer(String firstname, String surname, String ssn, Account account) {
    this.firstname = firstname;
    this.surname = surname;
    this.ssn = ssn;
    this.account = account;
    this.accountList = new ArrayList<Account>();
}

// set and get methods here (not relevant I think)

public void addAccount(Account account) {
    this.accountList.add(account);
}

Account.java

public class Account {
    private String accountNo;

    public Account(String accountNo) {
            this.accountNo = accountNo;
    }

    public void setAccountNo(String accountNo) {
            this.accountNo = accountNo;
    }

    public String getAccountNo() {
            return accountNo;
    }
}

1 个答案:

答案 0 :(得分:0)

您的客户已拥有自己的帐户列表。 由于'accountList'被定义为对象 - 实例变量,因此创建的每个Customer都将拥有自己独立的帐户列表。

如果您添加'static'关键字并将其设为类变量,则所有客户都只会共享此列表(例如,无论您创建的客户数量是多少,只有这一个列表。)

但我建议您进行两项更改:

1。)从Customer中删除Account变量。由于您有一个包含所有这些帐户的列表,我没有看到任何一个帐户附加到该客户(除非它是某种主要帐户或类似的,但在这种情况下,它将与列表中的那些不同它的类型)。

2.。)仍然可以从您的客户ID中处理帐户更改构造函数,如下所示:

public Customer(String firstname, String surname, String ssn, Account account) {
this.firstname = firstname;
this.surname = surname;
this.ssn = ssn;
this.accountList = new ArrayList<Account>();

//directly add the first account to the list of accounts
if(account != null){
    accountList.add(account);
}

3。)(可选)上面的构造函数不满意。如果有人在创建客户时准备好帐户对象,那么调用者(最终是你;)的可能性很高)有一大堆帐户要添加到此客户,因此ID更改我的构造函数是这样的:

    public Customer(String firstname, String surname, String ssn, List<Account> accounts) {
    this.firstname = firstname;
    this.surname = surname;
    this.ssn = ssn;
    this.accountList = new ArrayList<Account>();

    //directly add the first account
    if(accounts != null){
        this.accountList = accounts;
    }
}

如果呼叫者拥有该客户的帐户列表,他可以直接交付创建对象的整个列表。另一方面,如果他还没有准备任何账户,他将只提供空值,并且您已准备好空列表。

如果没有账号准备就绪,如果你不喜欢上面的“null”,那么“varargs”(变量参数)也有可能提出某种类型的0-n参数:

public Customer(String firstname, String surname, String ssn,
        Account... accounts) {
    this.firstname = firstname;
    this.surname = surname;
    this.ssn = ssn;
    this.accountList = new ArrayList<Account>();

    // If any accounts delivered, add them to the list
    for (Account tempAccount : accounts) {
        if (tempAccount != null) {
            accountList.add(tempAccount);
        }
    }
}

在此示例中,您可以像这样使用它:

public static void main(String[] args){


    // Case "I dont have a Account yet, just make me a Customer!
    Customer myCustomer = new Customer("Foo", "Bar", "bla");

    // Case "I already have a Account, letme directly add that to the Customer that i want to create now"
    Account a = new Account();
    Customer myCustomer2 = new Customer("Foo", "Bar", "bla", a);

    // Case "I already have a list of Accounts, letme directly add that to ..."
    Account b = new Account();
    Account c = new Account();
    List<Account> accounts = new ArrayList<Account>();
    accounts.add(b);
    accounts.add(c);

    Customer myCustomer3 = new Customer("Foo", "Bar", "bla", accounts.toArray(new Account[0]));
}

抱歉,在我注意到你需要一个对象数组而不是一个列表之前,我开始写关于varargs的文章。这就是为什么我们将“toArray” - 方法作为一种解决方法,使我们的帐户列表成为一个帐户数组。但是如果不明确的话,请不要犹豫,忽略关于varargs的部分,并选择构造函数获取一个帐户列表(或null)。

我认为你正在学习Java,如果是这样的话:到目前为止,你做得很好。不要被所有的信息搞糊涂,继续。我建议您阅读有关对象实例变量和类变量的内容,以阐明哪些对象共享,哪些不共享。多年来,“更好”的设计将随之而来,不用担心这样的“设计问题”并与他们一起玩,因为他们会教你“艰难的道路”。