3 分钟阅读
AtomicInteger:原子自增不等于整个流程原子
多个线程对普通 int 执行 ++,可能丢失更新。即便替换成 AtomicInteger,先判断再增加的业务流程也不一定安全。
多个线程对普通 int 执行 ++,可能丢失更新。即便替换成 AtomicInteger,先判断再增加的业务流程也不一定安全。
Integer 是 Number 的子类,但把 List<Integer> 交给接受 List<Number> 的方法会编译失败。集合如果同时允许读写,简单的类型替换会破坏安全性。
把用户列表转成 Map 时,同一个业务 ID 出现两次,收集过程可能抛异常。重复数据究竟应该覆盖、合并还是拒绝,需要显式决定。
在 map 里加了打印语句,程序却没有输出,可能不是数据为空,而是流水线尚未被消费。
用户输入一个点号,本想精确搜索点号,却匹配了任意字符。把外部文本直接拼进正则,会改变匹配规则。
同一文件在开发机正常,在另一台机器上出现乱码,往往是因为依赖了隐含字符集或文件来源没有约定编码。
订阅有效期加一个月,和计时器等待固定秒数,不能使用同一种直觉。自然月长度不同,地区时钟也可能调整。
数据库里存了“上午九点”,却没存时区,跨地区展示时就无法确定它究竟对应哪个时间点。日志时间和日历预约有不同需求。
用字符串表示订单状态,拼写错误只有运行后才暴露。枚举能约束取值范围,但输入字符串仍需要边界转换。
一个只保存数据的对象,也可能有“数量必须大于零”这样的不变量。若每个调用方都自己验证,规则很容易出现分歧。
读取文件成功后,异常可能发生在解析阶段。把 close 放在最后一行,无法保证异常路径执行到那里。
业务层只抛出“处理失败”,会让日志丢掉文件路径、操作阶段和原始错误。异常信息既要给调用方语义,也要保留排查线索。