如何将枚举与分组和子分组层次结构/嵌套结合使用

2022-09-01 13:36:21

我有一个“类”,如下所示:enumExample

enum Example {
//enums belonging to group A:
   enumA1,
   enumA2,
   enumA3,
//enums belonging to group B:
   enumB1,
   enumB2,
   enumB3,
//enums belonging to group C:
   enumC1,
   enumC2,
   enumC3;
}

对于我的项目来说,它们都包含我所属的枚举非常重要(因为这是类构造函数中的参数)。Example

如何使用层次结构/嵌套来实现以下目标:enum

  • 一种测试 a 是否属于 A 组、B 组或 C 组的方法。例如,类似于 或 的东西是返回 true 的公共方法。enumExample.enumA1.isGroupBelonging(Group.A)isGroupBelonging(Example.enumA1,Group.A)

  • 能够对组 的子组执行相同的操作,和 。例如,组 A 可能具有子组 和 。然后,我想要一个可以执行诸如.ABCabcExample.enumA1.isSubGroupBelonging(SubGroup.a)public boolean

  • 一种完成所有这些操作的方法,而不需要有一些复杂的名称来堵塞我的代码。例如,如果能够在整个其他类中引用它,而不必使用类似或enumExample.enumA1Example.enumA1(Group.A,SubGroup.a)Example.enumA1.Group.A.SubGroup.a


答案 1

我会使用一个非常简单的枚举构造函数,它将相应的组与枚举值相关联:

public enum Example {

    ENUM_A1 (Group.A),
    ENUM_A2 (Group.A),
    ENUM_A3 (Group.A),

    ENUM_B1 (Group.B),
    ENUM_B2 (Group.B),
    ENUM_B3 (Group.B),

    ENUM_C1 (Group.C),
    ENUM_C2 (Group.C),
    ENUM_C3 (Group.C);

    private Group group;

    Example(Group group) {
        this.group = group;
    }

    public boolean isInGroup(Group group) {
        return this.group == group;
    }

    public enum Group {
        A,
        B,
        C;
    }
}

用法:

import static Example.*;
import Example.Group;
...

ENUM_A1.isInGroup(Group.A);  // true
ENUM_A1.isInGroup(Group.B);  // false

要执行子组,您可以为组执行类似于例如的结构,用作构造函数和包含子组。Group(SubGroup ... subgroups)EnumSet<SubGroup>


答案 2

您可以使用 EnumSet 对各种枚举进行分组,而无需创建单独的枚举类:

public enum Example {

    ENUM_A1, ENUM_A2, ENUM_A3,
    ENUM_B1, ENUM_B2, ENUM_B3,
    ENUM_C1, ENUM_C2, ENUM_C3;

    public static EnumSet<Example> groupA = EnumSet.of(ENUM_A1, ENUM_A2, ENUM_A3);
    public static EnumSet<Example> groupB = EnumSet.of(ENUM_B1, ENUM_B2, ENUM_B3);
    public static EnumSet<Example> groupC = EnumSet.of(ENUM_C1, ENUM_C2, ENUM_C3);

}   

public static void main(String[] args){
    if(Example.groupA.contains(Example.ENUM_A1)){
       System.out.println("Group A contains ENUM A1");
    }
}