在Java中实现简易银行账户管理_Java面向对象实战说明

发布时间 - 2025-12-31 00:00:00    点击率:
银行账户应封装为责任明确的实体,余额字段须private,仅通过deposit()和withdraw()校验后修改,构造方法拒绝负初始余额。

如何用 Java 类封装银行账户的核心行为

账户不是数据容器,而是有明确责任的实体。直接暴露 balance 字段或提供无校验的 setBalance() 方法,等于把取款机钥匙交给任意调用方。

  • 必须用 private 修饰余额字段,强制所有变更走业务方法
  • deposit(double amount)withdraw(double amount) 是唯二修改余额的入口,内部需校验金额正负、透支等逻辑
  • 构造方法应拒绝负初始余额,例如:
    public Account(String accountNumber, double initialBalance) {
        if (initialBalance < 0) {
            throw new IllegalArgumentException("Initial balance cannot be negative");
        }
        this.accountNumber = accountNumber;
        this.balance = initialBalance;
    }

为什么不能用 double 表示货币金额

浮点数精度问题在金融场景下是致命的。比如 0.1 + 0.2 在 Java 中结果是 0.30000000000000004,不是数学意义上的 0.3

  • 必须使用 BigDecimal储和计算金额,且构造时用字符串(new BigDecimal("100.50")),避免 double 构造器引入误差
  • 所有加减乘除操作都调用 add()subtract()multiply()divide() 方法,并指定 RoundingMode
  • 显示输出前用 setScale(2, RoundingMode.HALF_UP) 统一保留两位小数

转账操作必须跨账户原子性处理

转账不是两个独立操作:A 减钱、B 加钱。中间若发生异常(如 A 扣款成功但 B 入账失败),会导致资金丢失或重复入账。

  • 转账方法应定义在外部服务类(如 BankService)中,而非单个 Account 类内
  • 必须用同步块或显式锁控制并发,防止多线程同时对同一账户操作引发竞态条件
  • 推荐先校验双方账户有效性及余额充足性,再执行扣减与增加,任一环节失败则全部回滚(实际项目中需结合事务管理器,简易版可用布尔返回值+状态重置)

账户编号生成与唯一性保障的实操陷阱

Math.random() 或简单递增整数生成账号,在多实例或高并发下极易冲突。

  • 开发阶段可用 UUID.randomUUID().toString().replace("-", "").substring(0, 10) 快速生成伪唯一 ID
  • 生产环境必须依赖数据库主键自增、Snowflake 算法或分布式 ID 生成服务
  • 若用内存集合(如 Map)做账户仓库,添加新账户前必须检查 map.containsKey(accountNumber),否则覆盖已有账户
账户对象的边界意识比语法更重要——它不负责存储、不负责网络、不负责日志,只专注“钱怎么动”这一件事。很多初学者写的账户类最后塞进了读文件、连数据库、打印报表的代码,本质上已经不是账户,而是一个失控的上帝类。


# java  # ai  # 金融  # 为什么  #  


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


相关推荐: Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  如何注册花生壳免费域名并搭建个人网站?  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  JavaScript如何操作视频_媒体API怎么控制播放  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  如何在云主机上快速搭建网站?  浅述节点的创建及常见功能的实现  怎样使用JSON进行数据交换_它有什么限制  Laravel怎么实现模型属性的自动加密  企业网站制作这些问题要关注  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel定时任务怎么设置_Laravel Crontab调度器配置  Laravel如何处理文件下载请求?(Response示例)  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  香港服务器建站指南:免备案优势与SEO优化技巧全解析  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  青岛网站建设如何选择本地服务器?  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  如何在Windows服务器上快速搭建网站?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  详解jQuery中的事件  JavaScript实现Fly Bird小游戏  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  如何在企业微信快速生成手机电脑官网?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  装修招标网站设计制作流程,装修招标流程?  奇安信“盘古石”团队突破 iOS 26.1 提权  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  如何在IIS中新建站点并配置端口与物理路径?  利用python获取某年中每个月的第一天和最后一天  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  轻松掌握MySQL函数中的last_insert_id()  Android使用GridView实现日历的简单功能  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Python自动化办公教程_ExcelWordPDF批量处理案例  浅谈redis在项目中的应用  微信小程序 input输入框控件详解及实例(多种示例)  Laravel如何实现本地化和多语言支持?(i18n教程)  js实现获取鼠标当前的位置