背景:假期表查询,表中存放的工作日信息是按照月份维度的,例如1月的假期表信息是NNNYYYYYNN.....一共31天,如果是工作日那么就是Y,如果非工作日那就是N。获取指定日期的下一个工作日,就会先查出这个月份的这条假期表记录,定位到这个日期所在的位置,然后遍历判断下一个Y是什么时候,找到下一个工作日。如果跨月的话,需要查询下一个月份的假期表记录
问题:同一事务,跨月查询(如查1月31日的下一工作日,此时会查询1月和2月的假期表数据),然后再查回1月的假期表数据,此时一月的假期表数据就有问题。根本原因是浅拷贝使用不规范,A浅拷贝给B,然后A还在被使用,同时B的信息也在被更改。导致B信息的修改直接影响到了A,即:此时查出来的假期表对象workDay已经被修改为2月份的对象了,这个时候想要查询1.31就会有问题,因为2月份最多只有29天,对应的假期表对象:YYYYYNNNNYYNNN....(只有29个标志位)
解决:赋值不要使用引用拷贝,而是使用深拷贝,new一个新的对象。
浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点)