Java9项目中向时间有序ArrayList插入符合10分钟间隔要求的订单对象的实现问题
现有实现存在的核心问题
- 单位换算逻辑混乱,校验结果完全失准
代码里定义10分钟阈值min10 = 10*60*1000是毫秒级单位,但在判断已有订单时间时,特意对getOrderTime().getTime()做了/1000转成秒级单位,和毫秒级的新订单时间直接做差,两者量级差1000倍,哪怕新老订单时间只差1秒,算出来的差值也远大于10分钟阈值,永远无法触发正确的间隔判断。 - 大量拼写、类型不一致的问题,直接导致代码无法编译
- 变量定义时写的是
prew,后续else分支里错写成prec,无对应变量定义 - size=1的分支里满足条件后调用
addOrder(order),但方法入参是ord,不存在order变量 - 最后
addOrder方法的参数类型错写为Orderd ord,和实际的Order类不匹配
- 变量定义时写的是
- 列表未做时间有序维护,插入逻辑完全错误
代码找到满足间隔条件的位置后,直接把新订单追加到列表末尾,完全不调整顺序。哪怕新订单时间比所有已有订单都早,也会被塞到列表最后,最终列表的相邻时间顺序完全混乱,间隔校验毫无意义。 - 间隔校验的场景覆盖不全
- else分支里的前序时间判断写的是
prec = i > 1 ? ... : 0,当i=0时前序时间直接取0,只要新订单时间远大于0就会被判定通过,根本没有考虑新订单可能插在列表最开头(比所有现有订单时间都早)的场景 - 循环判断时根本没比对新订单和当前遍历项的大小关系,只要数值差满足阈值就直接插入,完全不管位置匹配性
- else分支里的前序时间判断写的是
- 未覆盖“订单时间不可重复”的规则要求
整个校验流程没有判断新订单的时间是否和列表中已有订单时间完全相等,只做了间隔差值判断,完全没满足业务规则里的重复时间拦截要求。 - 集合设计存在隐患
orders被static修饰后,所有Pizzeria实例会共享同一个订单列表,多实例使用时会出现数据串扰;且ArrayList本身非线程安全,并发场景下会出现并发修改异常。
优化实现方向
- 统一时间计算单位
所有时间计算统一用毫秒值,用TimeUnit.MINUTES.toMillis(10)定义10分钟间隔阈值,避免不同单位混用导致的计算错误。 - 维护列表的时间有序性
每次插入新订单时,用二分查找定位新订单按时间排序的正确插入位置,保证列表元素始终按时间从早到晚排列,只需要校验新订单和相邻两个元素的间隔即可,不需要全量遍历。 - 拆分校验逻辑,覆盖所有规则场景
找到插入位置后依次校验:- 相邻的已有订单和新订单时间是否完全相等,存在相等则直接判定不合法
- 存在前序相邻订单时,校验新订单时间与前序订单的差值是否>=10分钟
- 存在后序相邻订单时,校验后序订单与新订单时间的差值是否>=10分钟
所有条件满足后,再把新订单插到对应位置,维持列表有序。
- 修正所有编译层面的错误
统一变量命名,修正方法参数的类型错写,保证代码可正常运行。 - 优化集合设计
移除orders的static修饰,改成类的普通成员变量,避免实例间数据共享的问题;多线程场景下可替换为线程安全的集合实现,避免并发异常。
内容的提问来源于stack exchange,提问作者RootAtKali
相关产品推荐
相关产品推荐

