流程控制与数据类型必须协同表达业务逻辑:用类型约束输入(如BigDecimal防浮点误差、int+if校验年龄范围),再以流程控制做语义检查(如枚举switch替代魔法值、泛型保障循环安全、TypeReference确保JSON反序列化准确)。

流程控制和数据类型不是两个独立模块,它们在业务代码里天然咬合——数据类型决定“能存什么、怎么算”,流程控制决定“根据这些值走哪条路、重复多少次”。写业务时,关键不是分别掌握语法,而是理解它们如何协同表达真实逻辑。
用数据类型约束输入,再用 if 做守卫校验
业务入口(如 Controller 或 Service 方法)收到的数据,必须先由类型守住底线,再用流程控制做语义检查。
- 比如接收订单金额,声明为 BigDecimal 而非 double,避免浮点误差;接着用 if 判是否为 null 或小于零
- 用户年龄字段用 int,但业务上“-1”可能是非法值,if(age 150) 就比只靠类型更贴近业务规则
- 状态码用 int 接收后,立刻转成枚举(如 OrderStatus.fromCode(code)),失败则抛异常或返回错误,不把脏数据拖进后续流程
循环遍历前,先看集合元素类型是否统一
for-each 循环的健壮性,高度依赖泛型声明的准确性。类型不对,循环里一调方法就空指针或 ClassCastException。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 查数据库返回 List
,循环中直接调 order.getPayTime() 安全;若误写成 List,运行时才暴露问题 - 处理 HTTP 返回的 JSON 列表,反序列化务必指定具体类型:new TypeReference
- >(){}
- 文件逐行读取用 String 接收,但每行可能是 CSV 格式,需先 split(",") 再按列类型解析:第1列转 long(ID),第2列转 BigDecimal(价格),第3列转 boolean(是否有效)
switch + 枚举替代魔法值判断,让类型和分支逻辑对齐
当多个分支基于同一类业务状态展开时,把状态定义成枚举,再用 switch 处理,既利用了类型的编译期检查,又让流程清晰可维护。
立即学习“Java免费学习笔记(深入)”;
- 支付渠道枚举 PAY_CHANNEL { ALIPAY, WECHAT, BANK },Service 中 switch(channel) 分支,每个 case 对应不同签名逻辑和回调地址
- 订单类型枚举 ORDER_TYPE { NORMAL, GROUP, FLASH },创建订单时 switch(type) 决定是否校验拼团人数、是否启用秒杀库存锁
- 避免用 int 或 String 做 switch:case "1": 和 case 1 都是魔法值,改一个漏一个;枚举名自带语义,IDE 还能提示补全和检查遗漏
运算符与数据类型配合,影响流程走向的精度和边界
流程控制中的条件表达式,本质是类型参与的运算结果。选错类型或运算符,会导致分支走错、循环多一次或少一次。
- 用 == 比较 Integer 对象可能出错(缓存范围外会 new 出新对象),应统一用 .equals() 或先 intValue()
- 计算分页参数时,int totalPage = (totalCount + pageSize - 1) / pageSize,这里用 int 是有意为之——向上取整,且结果不会超整型范围
- 时间比较用 LocalDateTime 而非 long 毫秒数,if(now.isBefore(expireTime)) 语义清晰,不易写反大小关系

















