从属性文件加载编译时常量

时间:2016-04-23 14:06:53

标签: java design-patterns enums

我正在开发一个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 ().

现在,如果我删除枚举并移动属性中的所有区域。我将不得不修改我的Dock类到这样的

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

现在我的来电者将成为

 Region china = dock.getShipmentDetailsForRegion ("region") 

现在我不想在代码中引入硬编码字符串值,因为这个更改会影响我的调用者类,现在它成为调用者类传递正确reion的责任,以前Dock只暴露了前面区域支持的方法。

在编译时是否有任何方法我不必使用硬编码字符串。

1 个答案:

答案 0 :(得分:0)

您可以编写一个脚本,该脚本使用XML文件或其他格式的枚举或静态最终变量生成代码。然后在构建过程中自动运行此脚本。据我所知,像Ant这样的构建工具可以做到这一点。