2016-04-23 5 views
0

私はxmlを受け取るjavaアプリケーションで作業していますが、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と呼ばれる1つのpojoを持っています。

このxmlから領域を抽出して領域オブジェクトを作成し、Dockオブジェクトに追加します。 ここでは、アプリケーションでサポートされているすべてのものを定義する列挙型も維持しています。

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

ここで、他の領域もサポートする必要があります。サポートチームによって地域をサポートするのが簡単になり、構成可能になるように、コードをリファクタリングしたいと考えています。

最小限の変更でコードを移動してプロパティファイルに保存したいと考えています。 私たちはいくつかの呼び出しコードを持っています。

dock.getChinaShipmentDetails() 
dock.getRussiaShipmentDetails(). 

ここで、私は列挙型を削除し、プロパティ内のすべての領域を移動します。私は今、私の発信者の意志はこの変更は、私の発信者に影響を与えるので、私は、コード内にハードコーディングされた文字列値を紹介したいいけない今

Region china = dock.getShipmentDetailsForRegion ("region") 

となり、この

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

のようなものに私のドッククラスを変更する必要があります以前はDockがサポートしていたメソッドのfore領域だけを公開していました。

ハードコードされた文字列を使用する必要はありません。

+0

実行時にプロパティファイルからのみ定数を読み込むことができます。コンパイル時の読み込みを許可しません。 – Sanjeev

答えて

0

XMLファイルまたはその他の形式から、列挙型または静的な最終変数を使用してコードを生成するスクリプトを記述できます。次に、このスクリプトをビルドプロセス中に自動的に実行します。私が知る限り、Antのようなツールを使ってこれを行うことができます。

+0

このアプローチではわずかなシワがあります。設定は別のプロジェクトとして、バイナリは別のプロジェクトとして保持します。設定を変更すると、設定が変更され、45分もかからない変更がリリースされますが、バイナリをリリースすることは、リージョンを追加するたびに必要としない長さのプロセスです。プロダクションの新しいコードバージョン –

+0

完全なプロジェクトを再構築する必要はなく、設定情報を含むクラスを生成して置き換えるだけです。 –

関連する問題