业务需求
简单的一次活动闯关任务,我将关卡配置存放在List
,然后每次一些关于关卡的操作都会读取配置。
错误出现
每次通过某些操作后,该人物相关的关卡进度都出现了错误,比如第1关通过了3次,发现第2关也通过了3次(而且仅在第1关和第3关出现)
原因
核心
:修改了关卡配置
在每次达成某些条件后需要计算该关卡的进度,比如该关卡有15次要求,每次达成条件后需要增加次数,此处由于偷懒,并没有再次返回一个DTO,而是在配置中增加了字段进行记录。在增加通过第一关次数的业务代码中还会判断是否又特殊关卡需要增加次数,所以当判断该字段不为null
的时候,就会对下一关进行次数增加(因为第一关和第三关都是特殊关卡,做了关联,第一关的下一关就是第三关)。因此导致了在程序启动之后,第一次对第一关进行计算的时候不会造成第二关的计算,但是在第一关达成之后,后续增加的次数需要增加到第三关。而该配置对象实例一直存放在内存中,没有被垃圾回收。因此第一关的字段中一直存在这个数值。
总结
不能偷懒少一个DTO,关卡的配置就当成配置,业务需要形成一个新的对象实例。也理解了对象在jvm内存中的生命周期。
因为线程内存中的对象实例随着线程而生死,但是全局配置的会一直存活在内存中。不要轻易进行修改