2012-06-14 2 views
5

Я понимаю, что я могу создать перечисление, как это:Может ли java enum иметь более одного конструктора?

public enum MyEnum { 
    ONE(1), 
    TWO(2); 
    private int value; 
    private MyEnum(int value) { 
     this.value = value); 
    } 
    public int getValue() { 
     return value; 
    } 
} 

Но у меня есть несколько вопросов:

1) Кажется, что значения перечисления объявлены в начале. Есть ли определенный формат для этого. Могу ли я объявить их где угодно?

2) Можно ли объявить перечисление с более чем одним конструктором и это то, что люди иногда делают?

+0

Уход за делом, как вы хотите его использовать? –

+1

Интересно, почему вы просто не пробовали 2) сначала? –

+0

Вы можете даже [перегружать конструкторы] (http://stackoverflow.com/q/6870710/1064325). – falsarella

ответ

5
public enum MyEnum { 
    ONE(1), 
    TWO(1, 2); 
    private int value1, value2; 

    private MyEnum(int value) { 
     this.value1 = value; 
     this.value2 = 0; // default 
     // this.value2 = getFromSomewhereElse(); // get it at runtime 
    } 

    private MyEnum(int value1, int value2) { 
     this.value1 = value1; 
     this.value2 = value2; 
    } 

    public int getValue1() { 
     return this.value1; 
    } 

    public int getValue2() { 
     return this.value2; 
    } 
} 
  1. Да, вы должны объявить значения перечислений на старте. Всегда.
  2. См. Код выше. Возможно. Если люди это делают, это зависит от приложения. Если у вас много полей, и большинство из них должно быть значением по умолчанию, полезно использовать несколько конструкторов. Кроме того, значения полей могут быть прочитаны во время выполнения (из файла или другого статического класса).
8
  1. Да, они должны быть объявлены перед другими полями класса enum.
  2. Да, они могут иметь более одного конструктора.

Возможно, вы обнаружили, попробовав это самостоятельно.

+0

Я знаю, как долго это возможно? Тем не менее, сейчас здесь, когда другие ищут его. Меня больше интересуют, в каких случаях было бы полезно –

+0

Перечисление - это класс. Если вы поняли, почему несколько конструкторов могут быть полезны для класса, вы также поняли, почему они могут быть перечислены: по тем же причинам. –

+0

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

3
  1. Согласно JLS 7, константы идут первыми.

  2. «Любые объявления конструктора или члена в объявлении перечисления применяются к типу перечисления точно так, как если бы они присутствовали в кубе класса объявления нормального класса, если явно не указано иное». и «Это ошибка времени компиляции, если объявление конструктора типа перечисления является общедоступным или защищенным». (Там же., 8.9.2)

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