使用Java中的复杂逻辑的EnumSet

时间:2012-11-27 10:11:41

标签: java oop validation enums

假设我有一个枚举:

enum EnumDemo{
 A1,
 A2,
 A3,

 B1,
 B2,
 B3,

 C1,
 C2,
 C3
}

我应该使用什么方法来创建可以包含多个EnumDemo元素的枚举,但所有这些元素应该来自一个组,例如:

{A1,B2,C1},{B1,C2},但不是{A1,A3,B1,C1}

任何想法都表示赞赏:)

3 个答案:

答案 0 :(得分:1)

您可以使用EnumSet.of方法生成最简单,最易读的集合:

 Set<EnumDemo> setA = EnumSet.of(EnumDemo.A1, EnumDemo.A2, EnumDemo.A3);
 Set<EnumDemo> setB = EnumSet.of(EnumDemo.B1, EnumDemo.B2, EnumDemo.B3);
 Set<EnumDemo> setB = EnumSet.of(EnumDemo.C1, EnumDemo.C2, EnumDemo.C3);

从那里你可以使用Collections使用union或difference生成你想要的不同集合。

如果您希望避免将A1添加到已包含A2的集合中的问题,则必须使用逻辑或通过创建三种不同的枚举类型来自行处理此问题( EnumAEnumBEnumC),仅包含其各自的成员。

答案 1 :(得分:1)

您可以保留其所属组的每个枚举元素ID。并根据此ID创建枚举组:

enum EnumDemo{
 A1(0),
 A2(0),
 A3(0),

 B1(1),
 B2(1),
 B3(1),

 C1(2),
 C2(2),
 C3(2);

 private int groupId;

 private EnumDemo(int groupId) {
   this.groupId = groupId;
 }

 public static Set<EnumDemo> getGroup(int groupId) {
    Set<EnumDemo> group = EnumSet.noneOf(EnumDemo.class);
    for (EnumDemo value : values()) {
      if (value.groupId == groupId) {
        group.add(value);
      }
    }
    return group;
 }
}

如果组是静态的并且不随时间变化,则此方法很好。您也可以创建类似Group的枚举,并使用它代替int作为id。您也可以在应用中动态更改groupId元素,但我不确定这是不错的方法。

答案 2 :(得分:0)

如何将它们分成不同的enum类型?

public interface EnumDemo {
}

enum AEnumDemo implements EnumDemo { A1, A2, A3 }
enum BEnumDemo implements EnumDemo { B1, B2, B3 }
enum CEnumDemo implements EnumDemo { C1, C2, C3 }

然后您可以使用EnumSet<? extends EnumDemo>作为集合的类型。

EnumSet<? extends EnumDemo> demos1 = EnumSet.allOf(AEnumDemo.class);
EnumSet<? extends EnumDemo> demos2 = EnumSet.allOf(BEnumDemo.class);
EnumSet<? extends EnumDemo> demos3 = EnumSet.of(AEnumDemo.A1, AEnumDemo.A3);
EnumSet<? extends EnumDemo> demos4 = EnumSet.of(BEnumDemo.B1, BEnumDemo.B2, BEnumDemo.B3);
EnumSet<? extends EnumDemo> demos5 = EnumSet.of(AEnumDemo.A1, BEnumDemo.B2);        // compile error