簡體   English   中英

如何指定枚舉構造函數

[英]How to specify enum constructor

目前,我有一個名為TestEnum的類。 在我的main方法,我可以工作firstEnumsecondEnum而無需指定firstEnum屬於GroupAsecondEnum屬於GroupB -代碼TestEnum排序了這一點。

假設firstEnumsecondEnum可以與三個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM