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

use*_*361 20 java enums grouping nested hierarchy

我有一个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;
}
Run Code Online (Sandbox Code Playgroud)

对我的项目来说,重要的是他们所使用的所有枚举都属于Example(因为这是类的构造函数中的参数).

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

  • 测试是否属于enumA,B或C组的方法.例如,类似于Example.enumA1.isGroupBelonging(Group.A)isGroupBelonging(Example.enumA1,Group.A)将是返回true的公共方法.

  • 能够对组的子组做同样的事情A,B并且C.例如,组A可能有子组a,bc.然后我想要一个方法,做一些像Example.enumA1.isSubGroupBelonging(SubGroup.a)这样的东西public boolean.

  • 一种方法来完成所有这些,而不需要一些精心设计的enum名称堵塞我的代码.例如,能够Example.enumA1在我的其他类中引用而不需要使用类似Example.enumA1(Group.A,SubGroup.a)或类似的东西来引用它将是很好的Example.enumA1.Group.A.SubGroup.a

ᴇʟᴇ*_*ᴀтᴇ 41

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

ENUM_A1.isInGroup(Group.A);  // true
ENUM_A1.isInGroup(Group.B);  // false
Run Code Online (Sandbox Code Playgroud)

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

  • 优秀解决方案 我还要添加`getGroup()`方法来获取当前组. (2认同)

Wen*_*del 29

您可以使用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");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 也见过[这里](http://jaxenter.com/enumset-in-java-regularenumset-vs-jumboenumset-106051.html) (3认同)
  • EnumSet中有保证订单吗?例如,我想按照以下顺序ENUM_A3,ENUM_A1,ENUM_A2来获取groupA的枚举.不确定EnumSet会保证我的订单 (2认同)
  • EnumSet不保证订单,但您可以使用'Collections.sort(new ArrayList(Example.groupA))'来订购它! (2认同)