将帐户对象添加到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));
}
}
我不手动跟踪#/帐户。由于几个不同的原因,这是“不好的”。这里有一个选择:
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);
}
好的,谢谢。我修正了这一点。 – user1508140 2012-07-09 04:40:43
@ user1508140 - 现在一切正常,对吗?你的“addAccount()”方法看起来很好。而且你还修改了“removeAccount()”,对吗? – paulsm4 2012-07-09 05:26:45
我需要看你如何实例化和使用银行的对象,但我会猜这就是你的问题。每当您创建一个新的银行时,账户列表就会被初始化 - 您是否在尝试访问账户列表时创建一个新的银行?
在我的BankTest中,我创建了一个新的银行,然后我在BankTest中进行了测试。 – user1508140 2012-07-09 04:20:28
我是否需要在测试中创建银行? – 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");
我甚至不会有一个numberOfAccounts变量,而是简单地返回通过调用ArrayList上的'size()'得到的int。 – 2012-07-09 03:48:50
你可以在你使用'Bank'类的地方显示代码吗? – nhahtdh 2012-07-09 03:48:54
@John:它是'size()',而不是'getSize()'。请看我上面的评论。 – 2012-07-09 03:54:35