2014-03-31 70 views
0

我有以下代碼Java擴展枚舉的switch語句

public interface EnumInterface{ 
    public String getTitle(); 
} 


public enum Enum1 extends EnumInterface{ 
    private String title; 
    Enum1(String title){ 
    this.title = title; 
    } 

    A("Apple"),B("Ball"); 
    @Override 
    public String getTitle(){ 
    return title; 
    } 
} 

public enum Enum2 extends EnumInterface{ 
    private String title; 
    Enum1(String title){ 
    this.title = title; 
    } 

    C("Cat"),D("Doll"); 
    @Override 
    public String getTitle(){ 
    return title; 
    } 
} 

,我如下

private EnumInterface[] enumList;//declared globally. 

if(flagTrue){ 
    enumList = Enum1.values(); 
}else{ 
    enumList = Enum2.values(); 
} 
.... 
.... 
private method1(int position){ 
    switch(enumList[postion]){ 
    case A:.... 
      break; 
    case B:.... 
      break; 
    case C:.... 
      break; 
    case D:.... 
      break; 
    } 
} 

我得到以下編譯時錯誤

使用它在其他類

無法打開EnumInterface類型的值。只有可轉換的int值或枚舉變量是允許的。

我做我的研究和發現,如果我這樣做,這樣一來,「開關」的情況下是不可能的。

+2

使用if-else。 –

+0

@TheGuywithTheHat你能否爲同樣的代碼演示一段代碼。謝謝 – Nik

+0

@Raj你想實現什麼? – Blackbelt

回答

2

在這種情況下,Switch語句絕對不是你想要的。即使上面的例子有效,並且沒有原因,你的結果也是完全錯誤的。上枚舉開關使用上述的類中使用的枚舉序,這是0 Enum1.A,1 Enum1.B,0爲Enum2.C,和1 Enum2.D。你可以看到爲什麼這是一個非常糟糕的主意。

EnumInterface類是不依賴任何方式的Java類型enum的,它只是定義了實現它,並提供您的getTitle()方法的類。這可能是Enum1,Enum2或任何其他可能不是Enum的類。所以當你想要根據EnumInterface進行切換時,你需要問自己你真正想要打開什麼。它是你希望用作條件的標題,還是你定義的枚舉爲表格帶來了其他東西?現在

,我去給你的疑點利益,並認爲不管你正在嘗試做的,它需要被關閉鍵入一個枚舉。我也會假設你不能以任何理由合併Enum1Enum2。下面是我對你完全超過設計的解決方案:

public interface EnumInterface { 

    public String getTitle(); 

    public void processEvent(SwitchLogicClass e); 
} 


public enum Enum1 implements EnumInterface{ 

    A("Apple"){ 
     public void processEvent(SwitchLogicClass e){ 
      //Any A specific Logic 
      e.doSomethingA(); 
     } 
    }, 
    B("Ball"){ 
     public void processEvent(SwitchLogicClass e){ 
      //Any B specific Logic 
      e.doSomethingB(); 
     } 
    }; 

    private String title; 
    Enum1(String title){ 
     this.title = title; 
    } 


    @Override 
    public String getTitle(){ 
     return title; 
    } 
} 

重複的Enum2。假設下類被稱爲SwitchLogicClass

private EnumInterface[] enumList;//declared globally. 

if(flagTrue){ 
    enumList = Enum1.values(); 
}else{ 
    enumList = Enum2.values(); 
} 
.... 
.... 
private method1(int position){ 
    EnumInterface[position].processEvent(this); 
} 


public void doSomethingA(){ 
    //Whatever you needed to switch on A for 
} 

public void doSomethingB(){ 
    //Whatever you needed to switch on B for 
} 

.... 
.... 

你幾乎肯定會需要基於任何抽象的圖案,你需要使用重構,但上面是我可以用我所知道你的代碼中做的最好的。

+0

真棒,完美..動態決定..謝謝。 :-) – Nik

0

什麼做的擴展實現,可以不使用一個簡單的Java enum做些什麼呢? 您可以使用if else塊,並調用equals方法。

+0

我使用Enums創建一個元素列表。在列表中點擊的項目中,我想調用一個方法。該名單將根據流動的應用程序 – Nik