将子类别添加到 Java 枚举

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是“液体”。