如何使用具有分组和子分组层次结构/嵌套的枚举?

28

我有一个名为 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层次结构/嵌套来实现以下功能:

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

  • 能够对ABC组的子组执行相同的操作。例如,组A可能有子组abc。那么我想要一种方法,比如Example.enumA1.isSubGroupBelonging(SubGroup.a),这是一个public boolean

  • 一种不需要使用一些复杂的enum名称而能在其他类中随时引用Example.enumA1的方式。例如,只需在其他类中引用Example.enumA1,而不需要使用Example.enumA1(Group.A,SubGroup.a)Example.enumA1.Group.A.SubGroup.a之类的方式。

2个回答

51

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

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>来包含子群。


2
出色的解决方案!我还会添加一个 getGroup() 方法来获取当前组。 - Shahar
美丽!比我期望的还要好! - funder7

36

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

3
也可以在这里看到:http://jaxenter.com/enumset-in-java-regularenumset-vs-jumboenumset-106051.html - ccDict
2
EnumSet中是否有保证的顺序?例如,我想要按照以下顺序为groupA枚举ENUM_A3、ENUM_A1、ENUM_A2。不确定EnumSet是否能保证我的顺序。 - Ewoks
2
EnumSet不能保证顺序,但是你可以使用“Collections.sort(new ArrayList(Example.groupA))”来对其进行排序! - Wendel
@Wendel 那样做是没有任何作用的,因为您无法访问该列表。 - shmosel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接