[英]How to specify enum constructor
目前,我有一個名為TestEnum
的類。 在我的main
方法,我可以工作firstEnum
和secondEnum
而無需指定firstEnum
屬於GroupA
和secondEnum
屬於GroupB
-代碼TestEnum
排序了這一點。
假設firstEnum
或secondEnum
可以與三個SubGrouping
enum
任何一個關聯。 我希望能夠從我的main
方法中進行這種關聯。 很明顯,我不能使用相同的方法與Grouping
,因為GroupA
被分配到firstEnum
從內部TestEnum
。
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-to-SubGroup映射,而不是動態構造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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.