【问题标题】:How to use enum with grouping and subgrouping hierarchy/nesting如何将枚举与分组和子分组层次结构/嵌套一起使用
【发布时间】:2013-11-09 22:02:20
【问题描述】:

我有一个名为Exampleenum 'class' 如下:

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(因为这是类的构造函数中的参数)。

我如何使用enumhierarchy/nesting 来实现以下目标:

    1234563 /li>
  • 能够对组ABC 的子组执行相同的操作。例如,组 A 可能有子组 abc。然后我想要一种方法来执行诸如Example.enumA1.isSubGroupBelonging(SubGroup.a) 之类的操作,即public boolean

  • 一种无需复杂的enum 名称即可完成所有这些操作的方法,这会阻塞我的代码。例如,能够在我的其他课程中引用Example.enumA1 而无需使用Example.enumA1(Group.A,SubGroup.a)Example.enumA1.Group.A.SubGroup.a 之类的东西来引用它会很好

【问题讨论】:

    标签: java enums nested grouping hierarchy


    【解决方案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 进行与 Example 类似的结构,使用 Group(SubGroup ... subgroups) 作为构造函数并使用 EnumSet<SubGroup> 来包含子组。

    【讨论】:

    • 优秀的解决方案!我还会添加getGroup() 方法来获取当前组。
    • 美女!比我想要的更好!
    【解决方案2】:

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

    【讨论】:

    • 另见here
    • EnumSet 中是否有保证顺序?例如,我希望按照 ENUM_A3、ENUM_A1、ENUM_A2 的顺序为 groupA 枚举。不确定 EnumSet 是否能保证我的顺序
    • EnumSet 不保证订单,但您可以使用 'Collections.sort(new ArrayList(Example.groupA))' 来订购!
    • @Wendel 这不会做任何事情,因为您将无权访问该列表。
    【解决方案3】:

    小补充:

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

    【讨论】:

      猜你喜欢
      • 2018-10-20
      • 1970-01-01
      • 2016-05-25
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 2018-08-25
      • 1970-01-01
      相关资源
      最近更新 更多