刚才排查出一个线上问题,极为严重,但是引发点却非常小,让人深省。
构造函数不写逻辑 这句话一直说,但是一直不理解原因,也确实没遇到过有问题的代码。但是今天却实实在在被坑了一大把,还是很长记性的,在这里记一下,以后警觉。
首先最开始我们的代码是这样的:
Repayment vo = new Repayment();
vo.setId(withholdvo.getRepaymentId());
vo.setStatus(0);
withholdService.updateRepayment(vo);
在这里是我写的代码,原意是更新一个Repayment的status。
一直运行也是正常的,但是后来我们同事加了句这样的代码:
public Repayment(){
amount = BigDecimal.ZERO;
amountPaid = BigDecimal.ZERO;
capital = BigDecimal.ZERO;
}
然后,可怕的事情就发生了,在更新的时候,把原有的Repayment里应有的数据全都更新成了0。
这样就很严重了,改了一大堆的数据才修复,而且当时这个Bug不好找,找了好久才发现。
这种的操作还是应该在init方法执行,或者说可以有一个带参数的构造函数来处理。