目前我有一个名为TestEnum
的类。在我的main
方法中,我可以处理firstEnum
和secondEnum
,而无需指定firstEnum
属于GroupA
,secondEnum
属于GroupB
- TestEnum
中的代码对此进行了排序。
假设firstEnum
或secondEnum
可以与三个SubGrouping
enum
中的任何一个相关联。我希望能够从我的main
方法中进行这种关联。很明显,我不能使用与Grouping
相同的方法,因为GroupA
是从TestEnum
内部分配给firstEnum
的。
public enum TestEnum {
firstEnum (Grouping.GroupA),
secondEnum (Grouping.GroupB);
private Grouping group;
TestEnum(Grouping group) {
this.group = group;
}
public enum Grouping {
GroupA, GroupB;
}
public enum SubGrouping {
SubGroup1, SubGroup2, SubGroup3;
}
}
我该怎么做?更具体地说,最好构造一个对象,例如:
TestEnum enumWithinMainMethod = TestEnum.firstEnum(SubGrouping.SubGroup1)
此实例的所需行为是它既属于SubGroup1
也属于GroupA
。那么从这样的实例中,最好具有该功能,例如:
switch(enumWithinMainMethod) {
case firstEnum:
// Do something associated with firstEnum
case secondEnum:
// Do something associated with secondEnum
default:
// ...
}
在采用这种方法之前请三思而后行。 枚举的目标是静态的、恒定的和有限的一组值。 您在这里所做的是使 Enum 不再恒定(因为您在运行时更改/初始化它)。
我相信还有其他方法可以做,例如,审查是否真的需要在运行时确定关系?不能在编译时定义吗? 您还可以使用TestEnum到子组的映射,而不是动态构造TestEnum的内容。
无论如何,虽然它不是可取的,但在 Java 中技术上是可行的。
当然,你不能延迟枚举的"构造",直到你的main()逻辑,但你可以让枚举正常构造,并改变内部状态。
// Mind the naming convention
public enum TestEnum {
FIRST_ENUM(Grouping.GROUP_A),
SECOND_ENUM (Grouping.GROUP_B);
private Grouping group;
private SubGrouping subGrouping;
TestEnum(Grouping group) {
this.group = group;
}
public void setSubGrouping(SubGrouping subGrouping) {
this.subGrouping = subGrouping;
}
public enum Grouping {
GROUP_A, GROUP_B
}
public enum SubGrouping {
SUB_GROUP_1, SUB_GROUP_2, SUB_GROUP_3;
}
}
然后在你的main()
,做一些类似的事情
TestEnum.FIRST_ENUM.setSubGrouping(TestEnum.SubGrouping.SUB_GROUP_1);
TestEnum.SECOND_ENUM.setSubGrouping(TestEnum.SubGrouping.SUB_GROUP_2);
通过这样做,您可以在main()
中定义枚举的子组
再一次,这是不可取的。
不能从enum
外部调用enum
构造函数。您可以使用类来获取此行为。
像这样的事情怎么样?(泛型不是必需的,但它确实将Groupable
类开放给多种类型的分组。
public enum Grouping { GroupA, GroupB; }
public enum SubGrouping { SubGroup1, SubGroup2, SubGroup3; }
public class SubGroupable<G extends Enum<G>,S extends Enum<S>> {
private G mainGroup;
private S subGroup;
public Groupable(G group, S subGroup) {
this.mainGroup = group;
this.subGroup = subGroup;
}
public G getGroup() { return mainGroup; }
public S getSubGroup() { return subGroup; }
}
用法
SubGroupable<Grouping, SubGrouping> g
= new SubGroupable<>(Grouping.GroupA, SubGrouping.SubGroup2);
switch (g.getGroup()) {
case Grouping.GroupA:
//
break;
case Grouping.GroupB:
//
break;
}
您还可以创建两个最终分组:
public final Grouping FIRST_GROUP = Grouping.GroupA;
public final Grouping SECOND_GROUP = Grouping.GroupB;
这样,您就可以在case
块中使用这些常量。
switch (g.getGroup()) {
case FIRST_GROUPING: // etc
}