简易零钱通项目:
(巩固javaSE基础的小练习)
基本功能:使用Java开发一个简易的零钱通项目,可以完成收益入账,消费,查看明细,退出系统等功能。
问题改进:
改进:
改进Bill中的toString方法,使输出格式更为一致和易读
1 2 3 4 5 6 7 8
| if(getAmount()>=0.0) return getName() +"\t\t+"+ getAmount()+"\t"+getDate()+"\t"; else return getName() +"\t\t"+ getAmount()+"\t"+getDate()+"\t";
String sign = amount >= 0 ? "+" : ""; return String.format("%s\t\t%s%.2f\t%s", name, sign, amount, date);
|
主程序start封装
- 职责分离:通过将启动逻辑(显示菜单、处理用户选择)封装在一个单独的方法中,代码的结构变得更清晰。
start方法作为系统的入口点,负责控制程序的运行流程。这样,SmallChangeSystem类的每个方法都有了明确且专一的职责,符合单一职责原则。
- 易于理解和维护:可以更容易地理解程序的流程。一看到
start方法,就知道这是程序的起点。它简化了程序的入口,使得程序的启动逻辑不散落在多个地方,易于追踪程序如何开始执行。
- 灵活性:如果将来想要修改程序的启动逻辑,比如增加初始化步骤、修改循环条件或者在程序退出前执行一些清理操作,只需修改
start方法即可。这提供了更好的灵活性和可扩展性。
- 更自然的循环控制:使用
while (running)循环直观地表达了“程序应该持续运行,直到不再running(即用户选择退出)”的逻辑。通过在循环内部根据用户的选择来更新running变量,可以更自然和灵活地控制程序的退出条件。这种方式比直接在switch或if语句中调用System.exit(0)更为优雅,因为它允许进行必要的清理操作而不是直接结束程序。
1 2 3 4 5 6 7 8
| public void start() { boolean running = true; while (running) { menu(); running = choice(); } }
|
系统自动记录时间
1 2
| String date=new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date());
|
收入/消费账单设置合二为一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public void addBill(boolean isIncome) { System.out.println("输入" + (isIncome ? "收益" : "消费") + "类型:"); String name = scanner.next(); System.out.println("输入金额:"); double amount = scanner.nextDouble(); if (!isIncome) amount = -amount; String date = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()); Bill bill = new Bill(name, amount, date); bills.add(bill); balance += amount; System.out.println("入账记录成功,请继续选择按键:"); }
|
代码展示:
APP类:
1 2 3 4 5 6
| public class APP { public static void main(String[] args) { SmallChangeSystem smallChangeSystem = new SmallChangeSystem(); smallChangeSystem.start(); } }
|
Bill类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| public class Bill { private String name; private double amount; private String date;
public Bill() { }
public Bill(String name, double amount, String date) { this.name = name; this.amount = amount; this.date = date; }
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public double getAmount() {return amount;}
public void setAmount(double amount) {this.amount = amount;}
public String getDate() {return date;}
public void setDate(String date) {this.date = date;} @Override public String toString() { String sign = amount >= 0 ? "+" : ""; return String.format("%s\t\t%s%.2f\t%s", name, sign, amount, date); } }
|
SmallChangeSystem类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| import java.text.SimpleDateFormat; import java.util.*;
public class SmallChangeSystem { private double balance = 0.0; private final ArrayList<Bill> bills = new ArrayList<>(); private final Scanner scanner = new Scanner(System.in); public void start() { boolean running = true; while (running) { menu(); running = choice(); } } public void menu() { System.out.println("-----------------零钱通菜单-----------------"); System.out.println("- 1 零钱通明细 -"); System.out.println("- 2 收益入账 -"); System.out.println("- 3 消费入账 -"); System.out.println("- 4 退出程序 -"); System.out.println("-请选择 1 - 4 : -"); } public boolean choice() { switch (scanner.next()) { case "1": check(); break; case "2": addBill(true); break; case "3": addBill(false); break; case "4": return exit(); default: System.out.println("没有此选项,重新输入"); } return true; } public void check() { System.out.println("-----------------零钱通明细-----------------"); if (bills.isEmpty()) { System.out.println("当前无账单记录"); return; } for (Bill bill : bills) { System.out.println(bill.toString() + "\t" + "余额: " + balance); } System.out.println("查看完毕,请继续选择按键:"); } public void addBill(boolean isIncome) { System.out.println("输入" + (isIncome ? "收益" : "消费") + "类型:"); String name = scanner.next(); System.out.println("输入金额:"); double amount = scanner.nextDouble(); if (!isIncome) amount = -amount; String date = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()); Bill bill = new Bill(name, amount, date); bills.add(bill); balance += amount; System.out.println("入账记录成功,请继续选择按键:"); } public boolean exit() { System.out.println("确定退出吗? 确定输入yes 返回输入no"); while (true) { String str = scanner.next(); if (str.equals("yes")) return false; else if (str.equals("no")) return true; } } }
|