今天又又又遇见一个神奇的问题。
顾问报过来一个BUG,说某个类方法里,调用bapi之后,类的某个实例属性被清空掉了,导致后续用到该属性的逻辑出了问题。
刚看到的时候我脑子里全是问号,并且有点想笑,怎么可能?
什么bapi这么nb,还能清空掉我的实例属性,先声明下,这个bapi并没有用到该属性,该属性也从未给到过引用。
抽空debug跟了一下代码,原来真的是我太年轻,bug见的不够多。
先说结论:调用某个class的实例方法中,调用了一个BAPI之后,class的 Instance Attribute 确实被清空掉了。
我当时脸色就变了,隐隐想到了一种可能,顺着这思路debug了下去...
果然...
事情是这样的:
这个BAPI里,有个BADI增强,该增强重新调用了该实例类去实现某些业务逻辑。
到这里都没问题,问题是调用这个类的时候,去实例缓存里读取了该类的实例,如果有,那么就用已有的实例,而不是新建一个。
也就是说,用了另一种方式搞了单例模式。
获取到当前实例之后,在某个方法里清空了某实例属性并重新赋值,逻辑赋值为空...
然后执行完了这部分业务逻辑,bapi返回到原来的class之后,由于都是同一个实例,所以该实例属性自然就是被清空掉的那个...
于是接下来的逻辑出了问题。
Debug完之后,秉秉气的半天说不出话。
解决方法也简单,有两种
1:干掉单例模式逻辑,因为执行的是两段业务,不应该用同一个实例
2:调用bapi前搞个本地变量存一下,之后的逻辑就用这个本地变量
最终选了第2种,因为咱也不知道为啥要用单例模式,咱也不敢改...