2014-02-20 3 views
6

überprüfen diesen Code aus -Java - vermeiden switch-Anweisungen für statische Funktionen

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; 
} 

Es gibt einen Weg, um die Switch-Anweisung zu vermeiden? wie es wirklich schlecht riecht.

Vielleicht zu etwas wie diesem? -

Das Problem mit meiner Lösung ist, dass die Funktionen statisch sind, und ich kann eine Schnittstelle mit statischen Funktionen nicht implementieren. Wenn Sie nicht verstanden haben, warum ich Interface schrieb, ist es, weil ich Polymorphismus in meiner Lösung oben verwenden wollte.

+2

Klingt so, als müsste man anstatt dieser statischen Methoden ein enum haben ... –

Antwort

15

Ich würde ein enum wie so haben:

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

    public abstract void doSomething(); 
} 

Und laufen um eine Enumeration Konstante, zum Beispiel diese Methode:

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

und nennen es mag:

invoke(Kind.GREEN); 

Dieser Weg sieht sauberer aus und ist außerdem sicherer, da Sie nur einen festen Satz von Eingängen haben können.

+0

Das ist ein wirklich nobler Refactor. Glückwunsch ! –

+0

+1: Omg. Nach 6 Jahren Java-Erfahrung wusste ich immer noch nicht, dass dies mit Enums möglich war ... :) –

+0

@MartijnCourteaux es ist sogar möglich, sowohl "instance variables" als auch Methoden in enums gleichzeitig zu übergeben; Syntax ist ein wenig auf der schweren Seite, obwohl – fge

3

Sie können eine Enum verwenden. Beispiel für einen einzelnen Eintrag Enum:

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; } 
} 

In Code, würden Sie dann tun Kind.valueOf(kind.toUppercase()).doSomething();.

Dies würde Ihnen auch erlauben, {Green, Red} Kind mit ein wenig Arbeit loszuwerden: einfach die ganze Logik in die enum.

+0

Ich mochte sowohl Ihre als auch Rohit Jains Antworten, die ich in wenigen Augenblicken annehmen werde. schwer zu wählen :) Danke euch allen übrigens – Israelg99