2013-10-25 8 views
29

Im Grunde habe ich eine enum für States geschrieben, und ich möchte nicht nur auf sie zugreifen können, sondern auch auf ihre Abkürzung und ob sie eine originale Kolonie waren oder nicht .Java enum mit mehreren Werttypen

public enum States { 
     ... 
     MASSACHUSETTS("Massachusetts", "MA", true), 
     MICHIGAN("Michigan",   "MI", false), 
      ...; //so on and so forth for all fifty states 

     private final Object[] values; 

     States(Object... vals) { 
      values = vals; 
     } 

     public String FULL() { 
      return (String) values[0]; 
     } 

     public String ABBR() { 
      return (String) values[1]; 
     } 

     public boolean ORIGINAL_COLONY(){ 
      return (boolean) values[2]; 
     } 
    } 

Dies scheint zu funktionieren, wie ich es erwarten würde. Ich kann

System.out.println(States.ALABAMA);     // Prints "ALABAMA" 
System.out.println(States.ALABAMA.FULL());   // Prints "Alabama" 
System.out.println(States.ALABAMA.ABBR());   // Prints "AL" 
System.out.println(States.ALABAMA.ORIGINAL_COLONY());// Prints "false" 

Für dieses spezielle Szenario Aufzählungen beteiligt, ist dies der beste Weg, dies zu tun, oder gibt es eine bessere Art und Weise zu installieren und diese Enum formatieren? Danke an alle im Voraus!

+5

Die Verfahren sollten nicht in allen Kappen sein. –

+0

Nicht einmal für Enums? Normalerweise benutze ich camel case, aber ich dachte, wenn man etwas statisches referenziert, das nie verändert wird, sollte es alle Caps sein, so wie das enum selbst wäre. –

+5

Es ist auch besser, wenn Sie tatsächlich Felder wie 'name',' abkürzung', 'isOriginalColony' hätten und einen Konstruktor' '(String, String, boolean)' 'hätten. Auf diese Weise ist es besser lesbar und verhindert auch, dass jemand in einem anderen Zustand die Argumente in der falschen Reihenfolge hinzufügt. –

Antwort

66

Zunächst sollten die Enum-Methoden nicht in Großbuchstaben angegeben werden. Sie sind Methoden wie andere Methoden, mit der gleichen Namenskonvention.

Zweitens, was Sie tun, ist nicht der beste Weg, um Ihre Enum einzurichten. Anstatt ein Array mit Werten für die Werte zu verwenden, sollten Sie für jeden Wert separate Variablen verwenden. Sie können den Konstruktor dann wie jede andere Klasse implementieren.

Hier ist, wie Sie es mit allen oben genannten Vorschläge tun sollten:

public enum States { 
    ... 
    MASSACHUSETTS("Massachusetts", "MA", true), 
    MICHIGAN  ("Michigan",  "MI", false), 
    ...; // all 50 of those 

    private final String full; 
    private final String abbr; 
    private final boolean originalColony; 

    private States(String full, String abbr, boolean originalColony) { 
     this.full = full; 
     this.abbr = abbr; 
     this.originalColony = originalColony; 
    } 

    public String getFullName() { 
     return full; 
    } 

    public String getAbbreviatedName() { 
     return abbr; 
    } 

    public boolean isOriginalColony(){ 
     return originalColony; 
    } 
} 
+0

@Marcin warum sollte das nicht privat sein? – tbodt

+0

Enum-Konstruktoren sind implizit privat –