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

带继承功能的枚举:Battle类设备枚举子分类使用需求问询

解决方案:用嵌套枚举+统一接口实现枚举分类支持

Java的枚举确实不支持直接继承,但我们可以通过嵌套枚举+标记接口的方式模拟"枚举子分类"的效果,让Battle类既能接受单个装备实例,也能直接传入整个分类的所有装备。下面是具体实现步骤和代码:

1. 定义统一的装备类型接口

先创建一个顶层接口,让所有装备相关的枚举都实现它,这样我们就能用这个接口作为统一的参数类型,兼容单个装备和分类数组:

public interface EquipmentType {
    // 可以添加通用方法,比如获取装备名称/属性
    String getName();
}

2. 实现带嵌套分类的装备容器

我们可以把主类作为容器,内部嵌套不同分类的枚举(比如武器、防御装备),所有嵌套枚举都实现EquipmentType接口:

public class Equipment {
    // 武器分类枚举
    public enum Weapons implements EquipmentType {
        HAMMER("锤子"),
        BOW("弓箭"),
        SWORD("长剑");

        private final String name;

        Weapons(String name) {
            this.name = name;
        }

        @Override
        public String getName() {
            return name;
        }
    }

    // 防御装备分类枚举
    public enum Defenses implements EquipmentType {
        SHIELD("盾牌"),
        HELMET("头盔"),
        ARMOR("铠甲");

        private final String name;

        Defenses(String name) {
            this.name = name;
        }

        @Override
        public String getName() {
            return name;
        }
    }
}

如果需要保留独立的装备实例(不属于任何分类),也可以让主类变成枚举并实现EquipmentType,内部再嵌套分类枚举,灵活度很高。

3. 改造Battle类支持混合参数

修改Battle的构造器,接受EquipmentType...可变参数,内部自动处理单个实例和分类数组的情况:

import java.util.HashSet;
import java.util.Set;
import java.util.Arrays;

public class Battle {
    private final Set<EquipmentType> allowedEquipments;

    public Battle(EquipmentType... equipmentTypes) {
        allowedEquipments = new HashSet<>();
        for (EquipmentType type : equipmentTypes) {
            // 判断当前参数是否是装备分类的数组(比如Weapons.values())
            if (type.getClass().isArray()) {
                // 强制转换为EquipmentType数组并遍历添加
                Arrays.stream((EquipmentType[]) type)
                      .forEach(allowedEquipments::add);
            } else {
                // 单个装备实例直接添加
                allowedEquipments.add(type);
            }
        }
    }

    // 测试方法:打印允许使用的装备
    public void printAllowedEquipments() {
        System.out.println("本次战斗允许使用的装备:");
        allowedEquipments.forEach(eq -> System.out.println("- " + eq.getName()));
    }
}

4. 测试使用示例

现在你可以完全按照需求创建Battle实例,混合传入单个装备和分类数组:

public class Main {
    public static void main(String[] args) {
        // 示例1:传入单个盾牌 + 所有武器
        Battle battle1 = new Battle(Equipment.Defenses.SHIELD, Equipment.Weapons.values());
        battle1.printAllowedEquipments();
        // 输出:盾牌、锤子、弓箭、长剑

        // 示例2:传入所有防御装备 + 单个弓箭
        Battle battle2 = new Battle(Equipment.Defenses.values(), Equipment.Weapons.BOW);
        battle2.printAllowedEquipments();
        // 输出:盾牌、头盔、铠甲、弓箭
    }
}

核心优势说明

  • 类型统一:通过EquipmentType接口,让单个装备和分类数组都能作为参数传入,无需额外转换。
  • 结构清晰:嵌套枚举天然划分装备分类,符合枚举的单例特性,避免重复定义。
  • 扩展方便:新增分类时只需添加嵌套枚举并实现EquipmentType,无需修改Battle类逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:00:40