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

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

如何用 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 而要封装成 TransactionManag

er

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

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

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

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

  • 读取金额时,用 scanner.hasNextDouble() 判断再 nextDouble(),而不是直接 nextDouble() 后 catch
  • 解析日期用 DateTimeFormatter.ofPattern("yyyy-MM-dd"),并 try-catch DateTimeParseException,提示“请输入 2025-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()(即 "2025-03-15T09:30"),读取时再 parse
  • 注意转义:用户备注含逗号或换行符?用双引号包裹字段,并将字段内双引号替换成两个双引号(标准 CSV 规则)
  • 每次保存都覆盖全量文件,别尝试追加——否则删除某条记录后,文件里还留着脏数据

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


# java  # go  # csv  # ai  # stream  # yy  # 为什么 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现API速率限制?(Rate Limiting教程)  北京专业网站制作设计师招聘,北京白云观官方网站?  如何在万网利用已有域名快速建站?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  Laravel如何配置Horizon来管理队列?(安装和使用)  使用C语言编写圣诞表白程序  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  中山网站制作网页,中山新生登记系统登记流程?  香港服务器选型指南:免备案配置与高效建站方案解析  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  Android 常见的图片加载框架详细介绍  Laravel如何处理异常和错误?(Handler示例)  如何快速打造个性化非模板自助建站?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  海南网站制作公司有哪些,海口网是哪家的?  如何登录建站主机?访问步骤全解析  iOS中将个别页面强制横屏其他页面竖屏  独立制作一个网站多少钱,建立网站需要花多少钱?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  微信公众帐号开发教程之图文消息全攻略  在线制作视频网站免费,都有哪些好的动漫网站?  Laravel如何为API生成Swagger或OpenAPI文档  C++用Dijkstra(迪杰斯特拉)算法求最短路径  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  电商网站制作价格怎么算,网上拍卖流程以及规则?  bing浏览器学术搜索入口_bing学术文献检索地址  实现点击下箭头变上箭头来回切换的两种方法【推荐】  大型企业网站制作流程,做网站需要注册公司吗?  大连网站制作公司哪家好一点,大连买房网站哪个好?  浅述节点的创建及常见功能的实现  如何在服务器上配置二级域名建站?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  常州企业网站制作公司,全国继续教育网怎么登录?  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Android okhttputils现在进度显示实例代码  JavaScript实现Fly Bird小游戏  如何实现建站之星域名转发设置?  如何在阿里云高效完成企业建站全流程?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  如何用IIS7快速搭建并优化网站站点?  创业网站制作流程,创业网站可靠吗?  Laravel如何与Inertia.js和Vue/React构建现代单页应用  如何为不同团队 ID 动态生成多个非值班状态按钮  Python结构化数据采集_字段抽取解析【教程】  Python函数文档自动校验_规范解析【教程】