【发布时间】:2019-10-31 20:51:41
【问题描述】:
我正在编写一些需要定义大量常量的代码。它主要处理Marketplace 常量(可能是美国、英国、印度、日本)和关联的MarketplaceMerchantMapping,它基本上将MerchantID 映射到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;
}
}
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.
}
还有其他类似的常量定义为枚举或静态常量。
这确实是不可扩展的,因为每次我们添加对新市场和商家的支持时,我们都需要更新大量文件并对其进行测试,而这些配置更改本身会占用大量开发人员时间。
理想情况下,我想知道是否有某种方法可以在某个配置文件中定义这些常量并读取这些文件以创建常量。有没有办法通过读取和解析一些配置文件来创建这样的枚举常量?
如果我有一个包含以下条目的配置文件:
配置文件.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
那么,它可以从配置文件中读取这些常量并构建适当的枚举或静态常量吗?
这可能吗?
【问题讨论】:
-
这可以达到 400 个 Marketplaces * 商家 ID 的数量...持续存在数据存储区,有什么害处?
-
如果所有值在编译时都已知,则使用枚举。如果您打算稍后扩展列表,则不应使用枚举。
-
哇哦!我们有接近相同的东西,但非常接近。我们所做的是构建一个很小的 xsd 模式并从中生成 xml 文件,并确实读取属性文件并映射它们……好吧,您将它们映射到枚举,我们将它们映射到
BitSets。例如,像美国这样的某个市场是一个由 52 个州组成的 BitSet——取决于我们需要在哪些州做不同的事情——我们应用一个掩码……虽然在评论中解释起来有点复杂。 -
@Naman 的建议很棒,但 OP 可能也适合我 - 我们没有 应用程序的这一部分 的数据存储 - 真的不想要介绍一个
-
当然可以,但是您使用它的方式决定了代码的实际外观。如果这些枚举常量没有为封装的字符串增加任何价值,甚至应该是可扩展的,那么与仅使用包含两个字母代码的字符串常量相比,该提议有什么实际优势?
标签: java enums config constants configuration-files