向java枚举添加子类别的设计模式
假设我有一个简单的Java枚举:
public Enum itemType
{
FRUITS("fru"),
VEGETABLES("veg"),
LIQUOURS("liq"),
SODAS("sod");
private String dbCode;
public ItemType(String dbCode){
this.dbCode = dbCode;
}
public String getDbCode(){
return this.dbCode;
}
}
现在,我想在这个枚举中引入一个“类别”,例如区分液体项目和固体项目。我在enum类中找到了两种方法,见下文。但是,两者都有相同的反模式:如果类别或项目数量不断增加/减少(想象100个项目类型和10个类别!),我有很多更新要做。我可以使用什么模式来设计这个枚举,使其尽可能干净和可重用
第一种方法:向枚举添加其他属性
public Enum itemType
{
FRUITS("fru",false),
VEGETABLES("veg",false),
LIQUOURS("liq",true),
SODAS("sod",true);
private String dbCode;
private boolean liquid;
public ItemType(String dbCode, boolean liquid){
this.dbCode = dbCode;
this.liquid = liquid;
}
public String getDbCode(){
return this.dbCode;
}
public boolean isLiquid(){
return this.liquid;
}
}
第二种方法:使用静态方法询问子类别
public Enum itemType
{
FRUITS("fru"),
VEGETABLES("veg"),
LIQUOURS("liq"),
SODAS("sod");
private String dbCode;
public ItemType(String dbCode){
this.dbCode = dbCode;
}
public String getDbCode(){
return this.dbCode;
}
public static boolean isLiquid(ItemType type){
switch(t){
case SODA:
case LIQOURS: return true;
default: return false;
}
}
# 1 楼答案
我会这样做:
例如,这将允许您添加新产品和类别(例如
BUTANE("but", GAS)
),而无需修改现有代码(如方法2中所发生的情况)另一方面,如果类别和项目的数量是长的和变化的,我会考虑使用SQL数据库。
# 2 楼答案
由于您正在对一些没有逻辑的东西进行建模,而这些逻辑不能以算法的方式进行编码(即,没有算法可以计算出
"sod"
是液态的,而"veg"
不是液态的),因此无法以一种或另一种方式枚举(项目、类别)的所有相关对有三种实施方法:
enum
,并将完整的项目列表附加到每个类别,或我建议采用第三种方法,因为它是最“对称”的方法。为具有类别代码的类别创建一个表,并添加一个包含所有类别对及其对应项的“交叉表”(或交叉文件)。在启动时读取交叉表/文件,并在两侧设置依赖项
交叉文件或交叉表可能如下所示:
您可以通过枚举对,在对的
item
端调用addCategory
,在对的category
端调用addItem
来处理它# 3 楼答案
用^{} 来做这个怎么样
然后可以使用
ItemType.LIQUIDS.contains(someItemType)
检查someItemType
是否为“液体”# 4 楼答案
这是三个很好的答案,但我认为我可以将这三个结合在一起:
现在,
boolean isVegetableLiquid = VEGETABLES.is(LIQUIDS);
FRESH_SQUEEZED_ORANGE_JUICE
所示李>EnumSet
和EnumMap
来提高性能,包括它们的方法,如contains
李>Enum
李>