2、 个人银行管理系统版本0.2(对应第5章记录)
2.1系统需求
为活期存储账户类加入记录所有账户总金额的功能,并且能够输出总金额,其余功能与之前一致。
2.2系统设计
在SavingsAccount类中增加一个静态数据成员total,用来记录所有账户总金额,并增加相应静态成员方法getTotal对其访问。SavingsAccount类如下图所示:
2.3系统实现
SavingsAccount.java
package self.SelfBank2.test;
public class SavingsAccount {
//储蓄账户类
private int id; //账号
private double balance; //余额
private double rate; //存款的年利率
private int lastDate; //上次变更余额的时期
private double accumulation; //余额按日累加之和
private static double total; //所有账户的总金额
private void record(int date, double amount) {
//获得到指定日期为止的存款金额按日累积值
if(date <= lastDate){
System.out.println("请检查输入!");
}else{
accumulation = accumulate(date);
lastDate = date;
amount = Math.floor(amount * 100 + 0.5) / 100; //保留小数点后两位
balance += amount;
total += amount;
System.out.println(date+"\t"+"#"+id+"\t"+amount+"\t"+balance);
}
}
private final double accumulate(int date) {
if(date < lastDate){
System.out.println("请输入正确的日期!");
return 0;
}else{
return accumulation + balance * (date - lastDate);
}
}
SavingsAccount(int date, int id, double rate){
//构造函数及相关成员函数的实现
if(date == 1 && rate > 0 && id > 0){
this.id = id;
this.balance = 0;
this.rate = rate;
this.lastDate = date;
this.accumulation = 0;
System.out.println(date+"\t"+"#"+id+" is created");
}else {
System.out.println("请检查输入!");
}
}
public final int getId() { return id; }
public final double getBalance() { return balance; }
public static double getTotal() {
return total;
}
public double getRate() { return rate; }
public void deposit(int date, double amount){
//存入现金;
record(date, amount);
}
public void withdraw(int date, double amount){
//取出现金
if (amount > getBalance())
System.out.println("Error: not enough money");
else if(amount <= 0){
System.out.println("请检查输入!");
}
else
record(date, -amount);
}
//结算利息,每年1月1日调用一次该函数
public void settle(int date){
double interest = accumulate(date) * rate / 365; //计算年息
if (interest != 0)
record(date, interest);
accumulation = 0;
}
//显示账户信息
public void show(){
System.out.println("#"+id+"\tBalance: "+balance);
}
}
Main,java
package self.SelfBank2.test;
public class Main {
public static void main(String[] args) {
//建立几个账户
SavingsAccount sa0 = new SavingsAccount(1,21325302,0.015);
SavingsAccount sa1 = new SavingsAccount(1,58320212,0.015);
//几笔账目
sa0.deposit(5, 5000);
sa1.deposit(25, 10000);
sa0.deposit(45, 5500);
sa1.withdraw(60, 4000);
//开户后第90天到了银行的计息日,结算所有账户的年息
sa0.settle(90);
sa1.settle(90);
//输出各个账户信息
sa0.show(); System.out.println();
sa1.show(); System.out.println();
System.out.println("Total: "+SavingsAccount.getTotal());
}
}
2.4系统测试
书上的例子得到的结果如下:
测试结果基本和之前版本相同,这里只测试了新加入的getTotal()函数。
使用Junit4来测试的代码如下:
初始化设置:
测试用例:
结果通过了测试:
2.5体会心得
这一节最大的问题是用const修饰的常函数在Java里怎么转换,我一开始认为将所有const换为final就可以,然而实际上有问题。const修饰成员函数的作用是:只能读取数据成员,不能改变数据成员。const成员函数只能调用const函数,不能调用其它非const成员函数;const对象只能调用const成员函数,不能调用非const成员函数。而final修饰的方法是不能被重载的,类似于类中的private方法,所以private方法默认是final的。所以final和C++的const差别太大了,而我查资料也没有发现关于java使用常函数的用法。然后既然是一种保护机制,我看了方法中的代码不涉及这个问题,所以没有这个功能也是可以的。
但我在代码中依然保留了final。带来的一个附带的好处就是,final方法可以被编译器优化,比如内联什么的,也就是说final的方法可能效率会高一些(仅仅是可能,具体取决于编译器),并且将方法的参数用final修饰的话,也可能会提高一定的性能。
有坑再填。。