2013-10-31 121 views
0

目前我有一個叫做TestEnum的類。在我main方法我可以firstEnumsecondEnum工作,而無需指定firstEnum屬於GroupAsecondEnum屬於GroupB - 代碼在TestEnum排序了這一點。如何指定枚舉構造函數

假設firstEnumsecondEnum可能與三個SubGroupingenum中的任何一個相關聯。我希望能夠通過我的main方法進行關聯。很明顯,我不能使用與Grouping相同的方法,因爲GroupATestEnum內分配給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: 
     // ... 
} 
+0

這種確切的行爲不是(據我所知)可能的。 – azz

+0

可能的重複[爲什麼不能枚舉構造函數在Java中受保護或公開?](http://stackoverflow.com/questions/3664077/why-cant-enum-constructors-be-protected-or-public-in- java) – Jackie

+0

你是指同一個枚舉不同的屬性? – farmer1992

回答

-1

不能從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 
} 
+0

如何使用類而不是枚舉來回答他問的問題? – Jackie

+0

您是否閱讀過整個問題?這是他所要求的近似行爲。 – azz

+0

也許你讀過這個問題了嗎? 「如何指定枚舉構造函數」。如果你覺得寫得不好,你可以編輯它。 – Jackie

0

雙認爲採取這種方法之前。枚舉旨在是靜態的,恆定的並且具有有限的一組值。你在這裏做的是讓Enum不再是常量(當你在運行時改變/初始化它)。

我相信還有其他方法可以做,例如,檢查一下是否確實需要在運行時確定關係?不能在編譯時定義它嗎?您也可能擁有TestEnum-to-SubGroup映射,而不是動態構建TestEnum的內容。

無論如何,雖然這不是優選的,但它在技術上是可行的。

當然,你不能延遲枚舉的「構造」,直到你的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()

您枚舉子分組,這是不可取的。