IntelliJ内联变量生成额外对象,代码行为异常问题咨询
IntelliJ内联变量后代码行为异常的原因分析
原代码
void setup() { var call = new DirectTransactCall(); call.setRequestId("3fa85f64-5711-4562-b3fc-2c963f61afa6"); expected = call; }
内联后得到的错误代码
void setup() { new DirectTransactCall().setRequestId("3fa85f64-5711-4562-b3fc-2c963f61afa6"); expected = new DirectTransactCall(); }
setRequestId方法实现
@Override public void setRequestId(String id) { this.requestId = id; }
问题原因
这是IntelliJ 2023.2.2版本的内联变量功能在处理变量先调用方法、后赋值给其他变量场景时的逻辑错误。原代码中call始终指向同一个DirectTransactCall对象:先调用setRequestId修改该对象的状态,再将这个已修改的对象赋值给expected。但IntelliJ错误地将两处call的引用分别替换为全新的对象实例,导致生成两个完全独立的对象:第一个对象调用setRequestId后立即被丢弃,第二个未设置requestId的对象被赋值给expected,完全违背了内联变量应保持代码行为一致的原则。
正确的内联结果
内联后应保证expected指向的是经过setRequestId修改后的对象,与原代码行为一致:
void setup() { expected = new DirectTransactCall(); expected.setRequestId("3fa85f64-5711-4562-b3fc-2c963f61afa6"); }
内容的提问来源于stack exchange,提问作者caduceus
相关产品推荐
相关产品推荐

