use*_*155 1 java enums design-patterns
假设我有一个简单的 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我现在想为这个枚举引入一个“类别”,例如区分液体物品和固体物品。我在 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;
}
}
Run Code Online (Sandbox Code Playgroud)
第二种方法:使用静态方法询问子类别
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;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
使用 an 怎么样EnumSet?
public enum ItemType
{
FRUITS("fru"),
VEGETABLES("veg"),
LIQUOURS("liq"),
SODAS("sod");
public static final EnumSet<ItemType> LIQUIDS = EnumSet.of(LIQUOURS, SODAS);
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后你可以用它ItemType.LIQUIDS.contains(someItemType)来检查是否someItemType是“液体”。