最近寫的東西有一個模塊是解析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
的參數都賦值給它,最終是有效的,沒有再出現編譯后變量更名的狀況 。