将帐户对象添加到ArrayList

问题描述:

public class Bank { 
    private ArrayList<Account> accounts; 
    private int numberOfAccounts; 

    public Bank() { 
     numberOfAccounts = 0; 
     accounts = new ArrayList<Account>(); 
    } 

    public int getNumOfAccounts() { 
     return numberOfAccounts; 
    } 

    public void addAccount(Account a) { 
     numberOfAccounts++; 
     accounts.add(a); 
    } 

    public Account findAccount(int id) { 
     int index = id - 1; 
     if (accounts.size() >= id){ 
      return accounts.get(index); 
     } 
     else return null; 
    } 

    public void addMonthlyInterest() { 
     for (Account x : accounts) { 
      x.addMonthlyInterest(); 
     } 
    } 

    public void removeAccount(Account a) { 
     numberOfAccounts--; 
     accounts.remove(a); 
    } 
} 

因此,当我将帐户添加到ArrayList,然后检查大小时,它会一直告诉我它没有任何内容。使用.add()添加的方式有什么问题吗?将帐户对象添加到ArrayList

这是我的BankTest的一部分。我不太确定为testAddAccount使用什么(JUnit明智),但我知道他们没有被添加,因为当我尝试查找帐户时,它们都不存在。

import static org.junit.Assert.*; 
import static org.junit.Assert.assertEquals; 

import java.util.ArrayList; 

import org.junit.Test; 

public class BankTest { 
    private final ArrayList<Account> accounts = new ArrayList<Account>(); 
    private Bank bank = new Bank(); 
    private java.util.Random rand; 
    // private static final double[] RATES; 
    // private static final int[] TYPES; 

    SavingsAccount sa = new SavingsAccount(0.034); 
    CheckingAccount ca = new CheckingAccount(0.034, 100); 
    CreditCardAccount cca = new CreditCardAccount(0.034, 100); 

    @Test 
    public void testAddAccount() { 
     // Tests Bank.addAccount() by adding many random accounts to the bank. 
     // SavingsAccount sa = new SavingsAccount(0.034); 
     SavingsAccount sa = new SavingsAccount(0.034); 
     CheckingAccount ca = new CheckingAccount(0.034, 100); 
     CreditCardAccount cca = new CreditCardAccount(0.034, 100); 
     bank.addAccount(sa); 
     bank.addAccount(ca); 
     bank.addAccount(cca); 
     if (accounts.size() == 3){ 
      System.out.println("true"); 
     }else System.out.println("false"); 

    } 

    @Test 
    public void testFindAccount() { 
     // Tests Bank.findAccount() by finding all existing accounts and 
     // attempting to find some non-existing accounts. 
     bank.addAccount(sa); 
     bank.addAccount(ca); 
     bank.addAccount(cca); 

     int size = accounts.size(); 
     System.out.println(size); 
     accounts.get(0); 
     assertEquals(sa, bank.findAccount(1)); 
     assertEquals(ca, bank.findAccount(2)); 
     assertEquals(cca, bank.findAccount(3)); 

     assertNull(bank.findAccount(50)); 
     assertNull(bank.findAccount(80)); 
     assertNull(bank.findAccount(230)); 

    } 

} 
+3

我甚至不会有一个numberOfAccounts变量,而是简单地返回通过调用ArrayList上的'size()'得到的int。 – 2012-07-09 03:48:50

+1

你可以在你使用'Bank'类的地方显示代码吗? – nhahtdh 2012-07-09 03:48:54

+0

@John:它是'size()',而不是'getSize()'。请看我上面的评论。 – 2012-07-09 03:54:35

手动跟踪#/帐户。由于几个不同的原因,这是“不好的”。这里有一个选择:

public class Bank { 
private ArrayList<Account> accounts; 
// private int numberOfAccounts; // No! 

public Bank() { 
    // numberOfAccounts = 0; // No! 
    accounts = new ArrayList<Account>(); 
} 

public int getNumOfAccounts() { 
    return accounts.size(); 
} 

public void addAccount(Account a) { 
    // numberOfAccounts++; // No! 
    accounts.add(a); 
} 
+0

好的,谢谢。我修正了这一点。 – user1508140 2012-07-09 04:40:43

+0

@ user1508140 - 现在一切正常,对吗?你的“addAccount()”方法看起来很好。而且你还修改了“removeAccount()”,对吗? – paulsm4 2012-07-09 05:26:45

我需要看你如何实例化和使用银行的对象,但我会猜这就是你的问题。每当您创建一个新的银行时,账户列表就会被初始化 - 您是否在尝试访问账户列表时创建一个新的银行?

+0

在我的BankTest中,我创建了一个新的银行,然后我在BankTest中进行了测试。 – user1508140 2012-07-09 04:20:28

+0

我是否需要在测试中创建银行? – user1508140 2012-07-09 04:41:03

你没有检查正确的ArrayList!您的代码:

// what is accounts variable for?? Get rid of it. 
private final ArrayList<Account> accounts = new ArrayList<Account>(); 

private Bank bank = new Bank(); 
private java.util.Random rand; 
// private static final double[] RATES; 
// private static final int[] TYPES; 

SavingsAccount sa = new SavingsAccount(0.034); 
CheckingAccount ca = new CheckingAccount(0.034, 100); 
CreditCardAccount cca = new CreditCardAccount(0.034, 100); 

@Test 
public void testAddAccount() { 
    // Tests Bank.addAccount() by adding many random accounts to the bank. 
    // SavingsAccount sa = new SavingsAccount(0.034); 
    SavingsAccount sa = new SavingsAccount(0.034); 
    CheckingAccount ca = new CheckingAccount(0.034, 100); 
    CreditCardAccount cca = new CreditCardAccount(0.034, 100); 
    bank.addAccount(sa); 
    bank.addAccount(ca); 
    bank.addAccount(cca); 
    if (accounts.size() == 3){ // **** accounts.size()??? 
     System.out.println("true"); 
    }else System.out.println("false"); 

你检查accounts.size()和帐户是一个局部变量,并没有通过银行,银行持有的对象账户的知识。 account.size()应该为0是很有道理的。为什么不检查银行变量的大小呢?这就是为什么银行有这种方法:

if (banks.getNumOfAccounts() == 3){ 
     System.out.println("true"); 
    }else System.out.println("false");