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

时间:2013-10-30 11:01:08

标签: java enums nested grouping hierarchy

我有一个名为enum的{​​{1}}'类',如下所示:

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是否属于A,B或C组的方法。例如,enumExample.enumA1.isGroupBelonging(Group.A)之类的内容将是返回true的公共方法

  • 能够对群组isGroupBelonging(Example.enumA1,Group.A)AB的子群做同样的事情。例如,A组可能包含子组Cab。然后,我想要一个执行c Example.enumA1.isSubGroupBelonging(SubGroup.a)之类的方法。

  • 一种完成所有这些操作的方法,无需使用一些精心设计的public boolean名称来堵塞我的代码。例如,能够在我的其他课程中引用enum而不需要使用Example.enumA1Example.enumA1(Group.A,SubGroup.a)

3 个答案:

答案 0 :(得分:39)

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

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

答案 1 :(得分:27)

您可以使用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");
    }
}

答案 2 :(得分:0)

小的添加:

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