(原创)记一个mvn compile的奇怪状况
2020-10-13 本文已影响0人
mona_alwyn
最近写的东西有一个模块是解析XML
文件提取数据然后导入到数据库里,包括RMSDB
和GraphDB
。使用方法是先将模块打包为jar
包,然后再放到SpringBoot
下面去调用。
这两天做优化重构,结果调试的时候发现迟迟得不到预期的数据,最后在模块的jar包中打断点的时候顺便读了下代码,居然和我所写的逻辑不一致,着实奇怪。
模块中这部分代码为:
// Before, do something
if (条件 1) {
...
// do something
List<Object> relationElementList = extractor.getRelationElementList();
relationLoader.loadRelationList(relationElementList);
...
// do something
return;
}
List(Object) classAElementList = extractor.getElementListByClass(A.class.getName());
elementLoader.loadClassA(classAElementList);
.....
// do something
if (条件 2) {
// do something
List<Object> relationBList = extractor.getElementListByClass(B.class.getName());
relationLoader.loadRelationList(relationBList);
....
} else {
List<Object> relationElementList = extractor.getRelationshipElementList();
relationLoader.loadRelationList(relationElementList);
.....
// do other things
}
但是我上层SpringBoot
中打开模块的jar包,看到的却是:
// Before, do something
List<Object> relationElementList;
// tips:这里只是简单的把return处理置后了
if (不为条件1) {
...
/*
奇怪的事情发生了,这里居然用的不是 classAElementList
*/
relationElementList = extractor.getElementListByClass(A.class.getName());
elementLoader.loadClassA(relationElementList);
...
// just do thins
List<Object> relationBList;
if (条件 2){
relationBList = extractor.getElementListByClass(B.class.getName());
relationLoader.loadRelationList(relationList);
...
} else {
/*
还有这里也替换了
*/
relationBList = extractor.getRelationshipElementList();
relationLoader.loadRelationList(relationBList);
.....
}
} else {
...
// do something
relationElementList = extractor.getRelationElementList();
relationLoader.loadRelationList(relationElementList);
...
// do something
}
虽然,我知道这里的两次变量替换本质上来说并不会影响功能的实现,只不过是相当于临时变量的更名,但还是有点奇怪这么处理是出于何种逻辑呢?
- 是说编译器认为一个条件判断语句的上下文其实是因为针对同一个变量来做不同的逻辑处理么?
- 还是故意为了制造那么一丢丢的阅读困难,来显示一下对于源代码的保护?
- 或者是因为我代码结构或者命名规则具有优化的必要?
最后我自己为了避免出现这种情况 ,主动在最外侧先声明relationElementList
,然后所有将要传入relationLoader
的参数都赋值给它,最终是有效的,没有再出现编译后变量更名的状况 。