有大量常量时定义常量的正确方法是什么?

Sun*_*mar 7 java enums config constants configuration-files

我正在处理一些具有大量要定义的常量的代码。它主要处理Marketplace常量(可以是美国,英国,印度,日本),并且与之相关MarketplaceMerchantMapping,基本上将a映射为MerchantIDa MarketplaceID

例如:

public enum Marketplace {

    US("US"),
    JP("JP"),
    UK("UK"),
    IN("IN"),
    NZ("NZ"),
    CA("CA"),
    FR("FR"),
    ... 
    ...

  // This could go up to some 400 marketplaces

    private final String stringValue;

    public boolean isWest() {
        return this == US || this == CA || this == UK;
    }

    public boolean isEast() {
        return this == IN || this == NZ || this == JP;
    }

}
Run Code Online (Sandbox Code Playgroud)
public enum MarketplaceMerchantMapping {

    USMAP(MarketplaceID.US, MerchantID.US, Marketplace.US),
    JPMAP(MarketplaceID.JP, MerchantID.JP, Marketplace.JP),
    UKMAP(MarketplaceID.UK, MerchantID.UK, Marketplace.UK),
    NZMAP(MarketplaceID.NZ, MerchantID.NZ, Marketplace.NZ),
    INMAP(MarketplaceID.IN, MerchantID.IN, Marketplace.IN),
    CAMAP(MarketplaceID.CA, MerchantID.CA, Marketplace.CA),
    FRMAP(MarketplaceID.FR, MerchantID.FR, Marketplace.FR),
    ...
    ... 

   // THis can go up to 400 Marketplaces * Number of merchantIds in each marketplace.


}
Run Code Online (Sandbox Code Playgroud)

还有其他与常量或静态常量相似定义的相似常量。

这实际上是不可扩展的,因为每次我们添加对新市场和商家的支持时,我们都需要去更新一堆文件并进行测试,而这些配置更改本身会占用大量开发人员时间。

理想情况下,我想知道是否有某种方法可以在某些配置文件中定义这些常量并读取这些文件以创建这些常量。有没有一种方法可以通过读取和解析一些配置文件来创建此类枚举常量?

因此,如果我有一个包含以下条目的配置文件:

ConfigFile.cfg:

WestMarketplaces = ("US", "AG", "MX", "CA", ...) // Expand this later as required
EastMarketplaces = ("IN", "AU", "SG", "JP", ...) // Expand this later as required
EUMarketplaces = ("UK", "FR", "SP", ...) // Expand this later as required

WestMerchantIds = ("WA", "WB", "WC", "WD", ...) // Expand this later as required
WestMerchantIds = ("EA", "EB", "EC", "WD", ...) // Expand this later as required
EUMerchantIds = ("EUA", "EUB", "EUC", "WDD", ...) // Expand this later as required

marketplaceMerchantMapping = {
  "US" = "WA";
  "CA" = "WB";
  "MX" = "WC";
  "AU" = "EA";
  "IN" = "EB";
  "JP" = "EC";
  "UK" = "EUA";
  "FR" = "EUB";
...
} // Expand this later as required
Run Code Online (Sandbox Code Playgroud)

然后,它可以从配置文件中读取这些常量并构建适当的枚举或静态常量吗?

这可能吗?

Gho*_*ica 5

如果无法使用数据库,那么维护良好的 XLS表可能是次佳的选择。与获取图纸数据的经过良好测试的过程一起,可以从中生成代码,或者用作某种属性配置输入。

正如OP认为的那样:当需要维护如此大量的“关键”属性时,Java源代码并不是理想的选择,但更重要的是,需要定期进行更新。

当然,这里的关键方面是:维护良好。每个人都必须遵循一个定义明确的过程,并且从“对XLS进行更改(理想情况下以版本控制的方式)更改到生成构建时所需的工件”的整个“链”应该简单且经过良好测试。


Dor*_*ray 1

如果您只想以更易读的方式编写枚举,您可以向它们添加一个属性:

public enum Marketplace {
     US("US", false, true),
     JP("JP", true, false),
     UK("UK", false, true),
     IN("IN", true, false),
     NZ("NZ", true, false),
     CA("CA", false, true),
     FR("FR", false, false);

     // This could go uptp some 400 marketplaces

     private final String stringValue;

     /** Markers for the getters */
     private final boolean isWest, isEast;

     Marketplace(String stringValue, boolean isEast, boolean isWest) {
         this.stringValue = stringValue;
         this.isEast = isEast;
         this.isWest = isWest;
     }

     public boolean isWest() {
         return isWest;
     }

     public boolean isEast() {
         return isEast;
     }
}
Run Code Online (Sandbox Code Playgroud)

从技术上讲,如果将其作为枚举的属性,则可以轻松地将它们保存在数据库中。如果您没有可用的数据存储,则必须在源代码中维护它们。