27

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

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层次结构/嵌套来实现以下目标:

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

  • A能够对 group和的子组做同样的B事情C。例如,组 A 可能有子abc。然后,我想要一种方法来执行诸如Example.enumA1.isSubGroupBelonging(SubGroup.a)which is a之类的操作public boolean

  • 一种不需要复杂的enum名称来阻塞我的代码的方式来完成这一切。例如,能够Example.enumA1在我的其他类中引用而不需要使用类似Example.enumA1(Group.A,SubGroup.a)Example.enumA1.Group.A.SubGroup.a

4

3 回答 3

47

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

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 执行与 Example 类似的结构,将Group(SubGroup ... subgroups)其用作构造函数并使用 anEnumSet<SubGroup>来包含子组。

于 2013-10-30T11:29:05.013 回答
35

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

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");
    }
}
于 2014-12-03T13:18:04.753 回答
2

小补充:

我确实喜欢@ELEVATE 和@Wendel 的两个答案。它(一如既往)取决于何时使用哪种解决方案。如果每个条目都必须属于单个组,我更喜欢 ELEVATE 的解决方案,因为它迫使我添加这个单个组。但是,如果只需要对一些枚举进行分组或者它们并不明显,我会选择 Wendel 的解决方案,因为它更灵活(但更容易出错)

于 2018-11-30T13:40:27.147 回答