2013-10-25 4 views
29

В основном то, что я сделал, это написать перечисление для государств, и я хочу не только иметь доступ к ним, но и получить доступ к их аббревиатуре и независимо от того, были ли они исходной колонией ,Перечисление Java с несколькими типами значений

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

Это похоже на работу, как я ожидал. Я могу

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" 

Для этого конкретного сценария с участием перечислений, это лучший способ сделать это, или есть лучший способ установки и формат этого перечисления? Спасибо всем заблаговременно!

+5

методы не должны быть заглавными буквами. –

+0

Даже не для перечислений? Обычно я использую корпус верблюда, но я подумал, что, ссылаясь на что-то статичное, которое никогда не меняется, оно должно быть все шапки, подобные самому перечислению. –

+5

Это также лучше, если у вас на самом деле были поля типа 'name',' abbreviation', 'isOriginalColony' и имел конструктор, принимающий' (String, String, boolean) '. Таким образом, это более читаемо, а также помогает предотвратить добавление человеком в другое состояние с аргументами в неправильном порядке. –

ответ

66

Во-первых, методы перечисления не должны быть во всех шапках. Это методы, подобные другим методам, с тем же соглашением об именах.

Во-вторых, то, что вы делаете, - это не лучший способ настройки вашего перечисления. Вместо использования массива значений для значений вы должны использовать отдельные переменные для каждого значения. Затем вы можете реализовать конструктор, как и любой другой класс.

Вот как вы должны сделать это со всеми выше предложения:

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

@ Марцин почему бы не быть частным? – tbodt

+0

Конструкторы enum неявно закрыты –

Смежные вопросы