Java中具有复杂逻辑的枚举集

Java中具有复杂逻辑的枚举集,java,oop,validation,enums,Java,Oop,Validation,Enums,假设我有一个枚举: enum EnumDemo{ A1, A2, A3, B1, B2, B3, C1, C2, C3 } 我应该使用什么方法来创建可以包含多个EnumDemo元素但所有元素都应该来自一个组的enumset,例如: {A1,B2,C1},{B1,C2},但不是{A1,A3,B1,C1} 如果您有任何想法,我们将不胜感激:)您可以使用EnumSet.of方法生成集合,这将是最简单、最可读的: Set<EnumDemo> setA = EnumS

假设我有一个枚举:

enum EnumDemo{
 A1,
 A2,
 A3,

 B1,
 B2,
 B3,

 C1,
 C2,
 C3
}
我应该使用什么方法来创建可以包含多个EnumDemo元素但所有元素都应该来自一个组的enumset,例如:

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


如果您有任何想法,我们将不胜感激:)

您可以使用
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);
Set setA=EnumSet.of(EnumDemo.A1、EnumDemo.A2、EnumDemo.A3);
Set setB=EnumSet.of(EnumDemo.B1、EnumDemo.B2、EnumDemo.B3);
Set setB=EnumSet.of(EnumDemo.C1、EnumDemo.C2、EnumDemo.C3);
在此基础上,您可以使用
集合
生成使用并集或差集所需的不同集合


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

您可以在其所属组的每个枚举元素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;
 }
}
enum枚举演示{
A1(0),
A2(0),
A3(0),
B1(1),
B2(1),
B3(1),
C1(2),
C2(2),
C3(2);
私有int-groupId;
私有枚举演示(int-groupId){
this.groupId=groupId;
}
公共静态集getGroup(int-groupId){
Set group=EnumSet.noneOf(EnumDemo.class);
对于(EnumDemo值:values()){
if(value.groupId==groupId){
增加(价值);
}
}
返回组;
}
}

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

将它们分离为不同的
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对组使用预枚举枚举有点奇怪,对我来说并不奇怪。我认为这比使用int更好。
groupId
被声明为
int
。我的意思是用
groupgroup
替换
int-grpupId
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