2014-02-20 60 views
6

看看這個代碼 -爪哇 - 避免switch語句的靜態函數

switch(kind) { 
    case "green" : 
      GreenKind.doSomething(); // Static function 
    break; 
    case "white" : 
      WhiteKind.doSomething(); // Static function 
    break; 
    case "blue" : 
      BlueKind.doSomething(); // Static function 
    break; 
    case "yellow" : 
      YellowKind.doSomething(); // Static function 
    break; 
} 

有一種方法,以避免switch語句?因爲它聞起來真的很糟糕。

也許這樣的事? -

kinds.get(kind).doSomething(); 

與我的解決方案的問題是這些功能是靜態的,我無法實現與靜態函數的接口。如果你不明白我爲什麼寫它的接口,因爲我想在上面的解決方案中使用多態。

+2

聽起來像你應該有一個枚舉,而不是那些靜態方法... –

回答

15

我將有一個enum像這樣:

enum Kind { 
    GREEN { 
     @Override 
     public void doSomething() { 
      GreenKind.doSomething(); 
     } 
    }, 
    WHITE { 
     @Override 
     public void doSomething() { 
      WhiteKind.doSomething(); 
     } 
    }; 

    public abstract void doSomething(); 
} 

而且繞過一個枚舉常量,例如這種方法:

public static void invoke(Kind kind) { 
    kind.doSomething(); 
} 

,並調用它像:

invoke(Kind.GREEN); 

這種方式看起來更清潔,而且更安全,因爲您只能擁有一組固定的輸入。

+0

這是一個非常優雅的重構。恭喜 ! –

+0

+1:Omg。經過6年的Java經驗,我仍然不知道這是可能的使用枚舉...... :) –

+0

@MartijnCourteaux它甚至可以同時傳遞「實例變量」和方法到枚舉中;語法有點沉重,儘管 – fge

3

您可以使用枚舉。單個條目枚舉的示例:

public enum Kind 
{ 
    GREEN("green") 
    { 
     @Override 
     public void doSomething() { /* do something */ } 
    }; 

    private final String asString; 

    public abstract void doSomething(); 

    Kind(final String asString) 
    { 
     this.asString = asString; 
    } 

    @Override 
    public String toString() { return asString; } 
} 

在代碼中,您將會執行Kind.valueOf(kind.toUppercase()).doSomething();

這也可以讓你擺脫{綠色,紅色}種類的一點點工作:把所有的邏輯放入枚舉中。

+0

我喜歡你和Rohit Jain的答案,一會兒就會接受。很難選擇:)順便謝謝大家 – Israelg99