You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java枚举类型使用:实现含子枚举的主枚举并访问子枚举字段

嗨,看你的需求是要搞一个主枚举来管理不同配菜大类(SALAD、FRY、TACO),每个大类下还有细分的子枚举(比如SALAD包含CHICKEN、AFGHAN等),还要能从外部方便访问子枚举的price字段对吧?结合你提到的Ray Tayek的思路,我整理了一套清晰的实现方案,刚好能满足你的需求:

核心思路

我们用接口来规范所有子枚举的行为(必须提供price字段的访问方法),然后让主枚举ESideItem关联每个大类对应的子枚举类型,这样既实现了分类管理,又能灵活地访问子枚举的属性。

具体实现步骤

1. 定义统一接口,规范子枚举的属性方法

先写一个接口,让所有子枚举都实现它,这样外部就能以统一的方式获取price:

public interface SideType {
    // 统一的价格访问方法
    double getPrice();
}

2. 实现各个子枚举类

每个配菜大类对应一个子枚举,里面定义该类下的细分餐品,同时实现SideType接口来暴露price字段:

SaladType子枚举(沙拉类)

public enum SaladType implements SideType {
    CHICKEN(5.99),
    AFGHAN(6.49),
    MIMOSA(7.29);

    // 私有价格字段,通过构造方法初始化
    private final double price;

    SaladType(double price) {
        this.price = price;
    }

    @Override
    public double getPrice() {
        return price;
    }
}

FryType子枚举(炸物类)

public enum FryType implements SideType {
    REGULAR(3.99),
    CHEESE(4.49),
    SPICY(4.79);

    private final double price;

    FryType(double price) {
        this.price = price;
    }

    @Override
    public double getPrice() {
        return price;
    }
}

TacoType子枚举(塔可类)

public enum TacoType implements SideType {
    BEEF(4.99),
    VEGGIE(5.49),
    FISH(5.99);

    private final double price;

    TacoType(double price) {
        this.price = price;
    }

    @Override
    public double getPrice() {
        return price;
    }
}

3. 创建主枚举ESideItem,关联子枚举类型

主枚举负责管理所有配菜大类,每个枚举项对应一个子枚举的Class,同时提供方法方便获取子类型:

public enum ESideItem {
    SALAD(SaladType.class),
    FRY(FryType.class),
    TACO(TacoType.class);

    // 持有对应子枚举的类型
    private final Class<? extends SideType> sideTypeClass;

    ESideItem(Class<? extends SideType> sideTypeClass) {
        this.sideTypeClass = sideTypeClass;
    }

    // 获取该大类下的所有细分餐品
    public SideType[] getSubTypes() {
        return sideTypeClass.getEnumConstants();
    }

    // 根据名称查找该大类下的特定细分餐品(忽略大小写)
    public SideType getSubTypeByName(String name) {
        for (SideType subType : getSubTypes()) {
            if (subType.name().equalsIgnoreCase(name)) {
                return subType;
            }
        }
        throw new IllegalArgumentException("找不到对应的细分餐品: " + name);
    }
}

4. 使用示例:访问子枚举的price字段

现在你可以轻松从外部访问任何子枚举的price字段了,比如:

public class MealDemo {
    public static void main(String[] args) {
        // 获取CHICKEN沙拉的价格
        SideType chickenSalad = ESideItem.SALAD.getSubTypeByName("CHICKEN");
        System.out.println("鸡肉沙拉价格: $" + chickenSalad.getPrice());

        // 遍历所有炸物的类型和价格
        System.out.println("\n所有炸物选项及价格:");
        for (SideType fryType : ESideItem.FRY.getSubTypes()) {
            System.out.println(fryType.name() + ": $" + fryType.getPrice());
        }
    }
}
这个方案的优势
  • 职责清晰:主枚举只管分类,子枚举只管具体餐品的属性(比如price),代码结构更干净
  • 统一访问:通过SideType接口,外部不用关心具体是哪个子枚举,直接调用getPrice()就能获取价格
  • 扩展性强:新增配菜大类或细分餐品时,只需要新增子枚举类,然后在ESideItem里加一个枚举项就行
  • 便捷操作:主枚举提供的getSubTypes()和getSubTypeByName()方法,方便遍历或查找特定餐品

内容的提问来源于stack exchange,提问作者Utshaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:05:08