2012-12-13 109 views
2

我想在Java中實現一個嵌套的枚舉。以下接口很好地完成了這項工作,但靜態valueOf()方法不可用。有什麼方法可以「重建」它嗎?Java中的嵌套枚舉

感謝您的所有答案!

public static interface ANIMAL 
{ 
    public static final ANIMAL UNKNOWN = _.UNKNOWN; 

    public static enum _ implements ANIMAL 
    { 
     UNKNOWN, 
    } 

    public static enum MAMMAL implements ANIMAL 
    { 
     ; 
     public static enum LAND implements ANIMAL 
     { 
      HORSE, 
      COW; 
     } 
     public static enum SEA implements ANIMAL 
     { 
      WHALE; 
     } 
    } 
} 
+4

與枚舉這是不可繼承實現繼承似乎不是個好主意...... – assylias

+0

但它工作得很好,除了上面提到的問題... –

+0

好這是我的觀點(你提到的問題);-) – assylias

回答

3

我不知道,如果你提供的例子是sscce或您的真正實施,但要記住,你不必是一個哺乳動物是土地的生物。此外,枚舉不可繼承,所以你可能最像這樣的東西是關:

public enum Type { 
    MAMMAL, REPTILE, INSECT; 
} 

public enum Region { 
    LAND, SEA, AIR; 
} 

public enum Animal { 
    HORSE (Type.MAMMAL, Region.LAND), 
    WHALE (Type.MAMMAL, Region.SEA), 
    LIZARD (Type.REPTILE, Region.LAND), 
    ANT (Type.INSECT, Region.LAND), 
    WASP (Type.INSECT, Region.AIR); 

    private Type t; 
    private Region r; 
    private Animal(Type t, Region r) { 
    this.t = t; 
    this.r = r; 
    } 
    public Type getType() { return t; } 
    public Region getRegion() { return r; } 
} 

這樣,你不困在繼承層次,你可以圍繞但是你想更換不同的描述。


好吧,現在我明白你想要什麼了。這是可能的,但你必須分別實現每個枚舉。問題是你不能做ANIMAL.valueOf("HORSE"),但你可以做ANIMAL.MAMMAL.LAND.valueOf("Horse")。另一種選擇是創建一個HashMap<String, Enum>,並使用它來近似功能,但難以使用,因爲難以投射到正確的子類。但它將有Enum所有方法...

+0

我想訪問eg這樣的馬: ANIMAL horse = ANIMAL.MAMMAL.LAND.HORSE; 這對於您的解決方案是不可行的。不是嗎? –

+0

「ANIMAL horse = ANIMAL.LAND.MAMMAL.HORSE」應該如何工作呢? – durron597

+0

不,這不應該起作用。不過,我認爲,我想在Java中根本不可能... –