java - 将子类别添加到 java 枚举

标签 java design-patterns enums

假设我有一个简单的 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;
    }
}

我现在想为这个枚举引入一个“类别”,例如区分液体元素和固体元素。我在枚举类中找到了两种执行此操作的方法,请参见下文。但是,两者都存在相同的反模式:如果类别数量或项目数量增加/减少(想象 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;
        }
}

最佳答案

使用 EnumSet 怎么样?为此?

public enum ItemType
{
    FRUITS("fru"),
    VEGETABLES("veg"),
    LIQUOURS("liq"),
    SODAS("sod");

    public static final EnumSet<ItemType> LIQUIDS = EnumSet.of(LIQUOURS, SODAS);

    // ...
}

然后您可以使用 ItemType.LIQUIDS.contains(someItemType) 来检查 someItemType 是否为“液体”。

关于java - 将子类别添加到 java 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34617482/

相关文章:

java - 错误: Error parsing XML: junk after document element when i put tabs Android

c++ - 在 C++ 中使用双字检查多个 bool 条件

c - 将 typedef 枚举初始化为字符串

java - org.apache.chemistry.opencmis.commons.exceptions.CmisUnauthorizedException : Unauthorized

java - 将java应用程序转换为jsp/servlet

java解析 float 而不用指数创建 float

c++ - 多个类头文件需要枚举类型

go - 为什么 Go 没有三元条件运算符

python - 这是工厂模式的正确实现吗?

asp.net - 为什么 MVC 中的所有 View 文件夹中都需要 web.config?