在Java里如何实现小型记账管理系统_Java面向对象实践说明

大枫酱_4831

大枫酱_4831

2026-01-21

309人浏览

原创

用Java建模记账系统需先定义Account、Transaction、Category(枚举)三类,封装TransactionManager管理业务逻辑与余额同步,输入校验防异常,CSV持久化确保数据可靠。

在java里如何实现小型记账管理系统_java面向对象实践说明

如何用 Java 类建模记账核心实体

记账系统最关键的不是界面或存储,而是把「账目」「账户」「分类」这些现实概念准确映射为类。别一上来就写 main,先想清楚职责边界。

  • Account 类只管账户名、余额、创建时间,不处理记账逻辑
  • Transaction 类必须包含金额(double amount)、类型(String type,如 "income" / "expense")、分类(Category category)、时间(LocalDateTime time)和可选备注
  • Category 用枚举比字符串更安全:
    public enum Category { FOOD, TRANSPORT, SALARY, ENTERTAINMENT }
  • 避免在 Transaction 里直接存账户名字符串——用 Account 引用,方便后期扩展(比如查某账户所有流水)

为什么不用 ArrayList 而要封装成 TransactionManager

直接在 Main 里用 ArrayList 看似简单,但很快会遇到:重复添加、按月筛选失效、余额算错、无法撤销操作。把这些逻辑全塞进一个列表变量,等于把业务规则藏在调用处,没人能一眼看出约束。

  • 新建 TransactionManager 类,内部持有一个 private List transactions
  • 提供 add(Transaction t) 方法,在里面校验:t.getAmount() != 0、t.getTime() != null、关联的 Account 是否已存在
  • 余额不能靠遍历重算——每个 Account 应维护自己的 balance,并在 TransactionManager.add() 中同步更新(否则多线程或频繁查询时性能崩盘)
  • 不要暴露 getTransactions() 返回原始 List,改用 unmodifiableList 或返回副本,防止外部误修改

控制台交互中容易被忽略的输入校验点

用户输错一个字符,程序就抛 InputMismatchException 或 DateTimeParseException,体验极差。Java 的 Scanner 默认不校验格式,得自己兜底。

Java Development Man
Java Development Man

Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。

下载
  • 读取金额时,用 scanner.hasNextDouble() 判断再 nextDouble(),而不是直接 nextDouble() 后 catch
  • 解析日期用 DateTimeFormatter.ofPattern("yyyy-MM-dd"),并 try-catch DateTimeParseException,提示“请输入 2024-03-15 格式”
  • 选择菜单项时,用 scanner.hasNextInt() + 范围检查(比如选项是 1–5,就判断 input >= 1 && input ),别依赖 nextInt() 的异常机制做流程控制
  • 字符串输入后立刻调用 trim(),空格导致的 "food " 和 "food" 不匹配是高频 Bug

文件持久化选哪种方式更轻量可靠

小型记账不需要数据库。用 ObjectOutputStream 直接序列化整个 TransactionManager?危险——Java 序列化版本不兼容、文件不可读、升级类字段后旧数据直接报废。

  • 选 CSV 更务实:每行一条交易,字段用逗号分隔,用 Files.write() 写入,用 Files.readAllLines() 读取
  • CSV 字段顺序固定:id,accountName,amount,type,category,date,note;日期统一用 toString()(即 "2024-03-15T09:30"),读取时再 parse
  • 注意转义:用户备注含逗号或换行符?用双引号包裹字段,并将字段内双引号替换成两个双引号(标准 CSV 规则)
  • 每次保存都覆盖全量文件,别尝试追加——否则删除某条记录后,文件里还留着脏数据

真正难的不是写完功能,是让每一笔账在重启后仍能对得上余额、分类不乱、日期不变成 1970 年——这些细节都在 TransactionManager 的增删改查契约里,不在 main 函数的 print 语句中。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java csv stream yy

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

3520

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

269

24

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7579

3

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

569

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1698

6

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

2025.09.05

7875

14

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

382

13

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

2026.04.09

384

30

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

2026.04.17

263

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习