2016-04-23 29 views
0

我正在開發一個java應用程序,在我們收到xml的時候,xml包含來自全球很多地區的一些數據。所以xml看起來像這樣從屬性文件加載編譯時間常量

<Shipment> 
     <Region> 
       <name>China</name> 
       <calculatedValue>0.001</calculatedValue> 
       <deviation>-1<deviation> 
     </Region> 
     <Region> 
       <name>Russia</name> 
       <calculatedValue>0.091</calculatedValue> 
       <deviation>-1<deviation> 
     </Region> 
     <Region> 
       <name>UK</name> 
       <calculatedValue>2.001</calculatedValue> 
       <deviation>-12<deviation> 
     </Region> 
     // lots of other regions // 
</Shipment> 

我們有一個叫做Dock的pojo。

public class Dock { 

    private Map<SupportedRegion, Region> regionalShipmentDetails = // 
    //some field and getter setter. 
    getChinaShipmentDetails() { this.regionalShipmentDetails.get(SupportedRegions.CHINA)} 
    setChinaShipmentDetails (Region china) { 
     this.regionalShipmentDetails.get(SupportedRegions.CHINA).add(china) 
    } 

    getRussiaShipmentDetails() {//same for russia} 
    setRussiaShipmentDetails (Region russia) {same for russia} 
} 

我們從這個xml中提取區域創建一個region對象並添加到Dock對象。 現在我們還維護一個枚舉,它定義了我們的應用程序支持的所有內容。

enum SupportedRegions{ 
    CHINA (201, "APAC"), 
    RUSSIA (202, "EUR") 
} 

現在我們正在獲得支持其他地區的要求。現在我們要重構我們的代碼,使其變得簡單和可配置,以便支持團隊支持地區。

我們希望將其移出代碼並以最小的更改保留在屬性文件中。 我們有一些類似的調用代碼。

dock.getChinaShipmentDetails() 
dock.getRussiaShipmentDetails(). 

現在,如果我刪除枚舉並移動屬性中的所有區域。我將不得不修改我的碼頭類這樣的事情

private Map<String, Region> regionalShipmentDetails = // 
    //some field and getter setter. 
    getShipmentDetailsForRegion (String region) { this.regionalShipmentDetails.get(region) 
    } 
} 

現在我的來電將變成

Region china = dock.getShipmentDetailsForRegion ("region") 

現在我不想介紹在代碼中硬編碼字符串值,因爲這種變化影響了我的來電顯示類,現在它成爲調用者類負責傳遞正確的reion,以前的Dock只是暴露了方法支持的區域。

有什麼辦法在編譯時我不必使用硬編碼的字符串。

+0

您只能在運行時從屬性文件加載常量,沒有允許編譯時加載 – Sanjeev

回答

0

您可以編寫一個腳本,該腳本用XML文件或其他格式生成具有枚舉或靜態最終變量的代碼。然後在構建過程中自動運行此腳本。據我記得,像Ant這樣的工具可以做到這一點。

+0

這種方法存在一點問題,我們將配置作爲單獨的項目和二進制文件保存爲單獨的項目。原因是如果有配置更改,我們更改配置並釋放幾乎不到45分鐘的更改,但釋放二進制文件是一個長度過程,我們不希望每當我們添加一個區域時,我們都不應該釋放生產中的新代碼版本 –

+0

您不需要重新構建完整的項目,只需生成包含配置信息的類並將其替換即可。 –