2012-07-24 15 views
15

Ich habe einen Enum-Typ (sagen wir für Argumente willen CarModel), in einer Anwendung (zahlreiche Klassen) verwendet.get() Methoden in Java enum Typ

public enum CarModel { 
    DIABLO, 
    P911, 
    DB7; 
} 

Ich habe verschiedene Methoden, die diesen CarModel Aufzählungstyp auf unterschiedliche Weise nutzen, und jeder hat eine Switch-Anweisung einige String variabel in Abhängigkeit von dem Aufzählungstyp zu setzen, bevor andere Sachen los zu tun. (z. B. den Hersteller eines Modells einstellen oder das Ursprungsland usw. setzen. Diese Ergebnisse sind zur Laufzeit statisch)

Das Problem ist, wenn ich ein neues Modell zur Enum hinzufügen möchte, müsste ich gehen zu jeder Methode und erweitern/modifizieren die switch-Anweisung, um ihre Existenz zu handhaben. Dies könnte leicht zu menschlichem Fehler und/oder Code-Duplikation führen (wenn verschiedene Methoden die gleichen Switch-Anweisungen verwenden).

Anstatt alle über Switch-Anweisungen verwenden, würde Ich mag statische Methoden haben, die in einem einzigen Ort bearbeitet werden könnten, und ähnlich für das Verhalten der folgenden erlauben würde:

String country = CarModel.DIABLO.getCountry() // returns Italy 
String manufacturer = CarModel.P911.getManufacturer() // returns Porsche 

Ist das möglich mit einem enum, (und ist ein eNUM auch der ‚richtige‘ Weg, dies zu tun?

Antwort

26

Sie so etwas tun kann.

public enum CarModel { 
    DIABLO("Lamborghini", "Italy"), 
    P911("Porsche", "Germany"); 

    private String manufacturer; 
    private String country; 

    private CarModel(String manufacturer, String country) { 
     this.manufacturer = manufacturer; 
     this.country = country; 
    } 

    public String getManufacturer() { 
     return manufacturer; 
    } 

    public String getCountry() { 
     return country; 
    } 
} 
+0

Ich mache das die ganze Zeit, liebe diese Features von enums. – Malcolm

+0

+1 ziemlich cool !!! alte Art enum. – BlaShadow

1

Außerdem Aufzählungen eine Schnittstelle implementieren können. Sie können einige get() Methoden wie getMaxSpeed() oder getWeight() hinzufügen. Schnittstelle wie

aussehen können
3

Wenn Sie Enums verwenden, würde ich vorschlagen, eine abstrakte Methode in der enum deklariert, und dann eine Bereitstellung für jede Enum-Instanz.

diese Weise können Sie Switch-Anweisungen nicht überall haben (von denen Sie leicht Fälle weglassen können), und Sie haben eine zuverlässigere und OO-Stil polymorphic Ansatz.

abstract public int getEngineSize(); 

DIABLO { 
    public int getEngineSize() { 
     return 6.3; // whatever it really is... 
    } 
} 

Siehe here für weitere Beispiele/Diskussionen usw.

+0

Ich hatte noch nie zuvor – NimChimpsky

+0

@NimChimpsky gesehen: Kein Wunder, weil andere Methoden wie die Korgen zeigt viel einfacher sind und weniger Code. –

+0

@ A.H. Ich schätze, sie erreichen dasselbe, aber das ist ziemlich merkwürdig und weniger lesbar - ist das ihr tatsächlicher Vorteil, den ich vermisse? – NimChimpsky

7

Ja, absolut. Enums können ihre eigenen Methoden haben, und diese Methoden können wertspezifisch sein. Es sieht so aus:

enum CarModel { 
    P911 { 
     public String getManufacturer() { return "Porsche"; } 
    }, 
    DB7 { 
     public String getManufacturer() { return "Aston Martin"; } 
    }, 
    ... 
    public abstract String getManufacturer(); 
} 

Sie können natürlich weitere Methoden hinzufügen.

+0

Entschuldigung. Musste den DB7 Hersteller hinzufügen :-) –

+0

Danke, kein Auto-Typ :) –

1

Ja, das ist ganz einfach:

public enum CarModel { 
    DIABLO("rod"), 
    P911("jane"), 
    DB7("freddy"); 

    private String name; 
    CarModel(String name){ 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 
} 
2

Ich würde vorschlagen, diese Informationen direkt in Ihr Enum hinzufügen.

So:

public enum CarModel { 

    DIABLO("Lambo"), 
    P911 ("Porsche"); 

    private String manufacturer; 


    private CarModel(String manufacturer) { 
     this.manufacturer = manufacturer; 
    } 

    public String getManufacturer() { 
     return manufacturer; 
    }  
} 

und in der Klasse würde man nur die getManufacturer Methode

verwenden, um