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
相关产品推荐
相关产品推荐

