3 分钟阅读
Duration 与 Period:一天未必等于 24 小时
订阅有效期加一个月,和计时器等待固定秒数,不能使用同一种直觉。自然月长度不同,地区时钟也可能调整。
订阅有效期加一个月,和计时器等待固定秒数,不能使用同一种直觉。自然月长度不同,地区时钟也可能调整。
数据库里存了“上午九点”,却没存时区,跨地区展示时就无法确定它究竟对应哪个时间点。日志时间和日历预约有不同需求。
用字符串表示订单状态,拼写错误只有运行后才暴露。枚举能约束取值范围,但输入字符串仍需要边界转换。
一个只保存数据的对象,也可能有“数量必须大于零”这样的不变量。若每个调用方都自己验证,规则很容易出现分歧。
读取文件成功后,异常可能发生在解析阶段。把 close 放在最后一行,无法保证异常路径执行到那里。
业务层只抛出“处理失败”,会让日志丢掉文件路径、操作阶段和原始错误。异常信息既要给调用方语义,也要保留排查线索。
某个缓存命中时,默认数据的数据库查询仍然发生,可能是因为把查询写进了 orElse。方法参数在进入方法前就会被求值。
排行榜只按分数排序,同分用户的次序可能让人困惑。稳定排序能保留输入顺序,但输入顺序本身未必稳定,尤其是来自数据库时。
配置查询里 get 返回 null,可能代表没有键,也可能代表这个键明确存了 null。直接套默认值,容易混淆这两种状态。
把列表放进 HashSet 能去重,但再拿出来可能不是原来的顺序。若测试只使用几个连续数字,这个问题还可能被掩盖。
复制 List 后修改元素,原列表仍然变化,是浅复制中常见的惊讶。容器独立和元素独立,需要分开判断。
在增强 for 循环中直接调用 list.remove,常会触发 ConcurrentModificationException。名称里有 Concurrent,并不意味着一定发生了多线程。