Постоянные выражения из Enum
Есть ли способ преобразовать перечисление в константное выражение? Я хочу, чтобы мой оператор переключателя выбирал среди значений перечисления, но я получил ошибку компиляции "выражения выражений должны быть константными выражениями", поэтому я попытался объявить его в переменной:
final int REG = MyEnum.REG.getIndex().intValue();
switch (service.getIndex()) {
case REG:
Но я все еще получаю ту же ошибку. Согласно документации Oracle, http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html
Выражение константы во время компиляции - это выражение, обозначающее значение типа примитива или String, которое не завершается внезапно и составляется с использованием только следующего:
• Литералы примитивного типа и литералы типа String
Так что это не работает, потому что я не использую литерал. Я думаю, что мне придется объявить это как:
final int REG = 8;
Но было бы намного лучше связать это с перечислением. Есть ли способ сделать это?
РЕДАКТИРОВАТЬ
Оказывается, мне не нужно использовать какую-либо окончательную переменную. Это так же просто, как:
switch (service) {
case REG:
Это не приходило мне в голову, пока я не увидел комментарий Андреа. Спасибо за ваши ответы.
2 ответа
Если возможно, измените ваш getIndex()
метод, так что он возвращает перечисление вместо целого числа. Если это невозможно, вам нужно сопоставить индекс с элементом enum:
Учитывая следующее перечисление:
public enum Index {
ONE,
TWO,
THREE
}
Вы можете сопоставить свой индекс с элементом enum, используя
Index.values()[index]
Учитывая ваш метод Integer getIndex()
, вы можете сделать что-то вроде
switch(Index.values()[getIndex()])
case ONE : ...
break;
case TWO : ...
break;
case THREE : ...
break;
}
Обратите внимание, что это может привести к ArrayIndexOutOfBoundsException
если вы пытаетесь получить доступ к индексу внутри перечисления, который больше, чем число элементов перечисления (например, в приведенном выше примере, если getIndex()
возвращает значение> 2).
Я бы инкапсулировал выражение Index.values()[getIndex()]
в метод перечисления, как valueOf(int index)
аналогично стандартному valueOf(String s)
, Затем вы также можете обработать правильную проверку индекса массива (и, например, вернуть специальное значение перечисления, если индекс выходит за пределы диапазона). Точно так же вы можете также преобразовать дискретные значения, которые имеют специальные значения:
public enum Index {
ZERO,
ONE,
TWO,
THREE,
REG,
INVALID;
public static Index valueOf(int index) {
if (index == 8) {
return REG;
}
if (index >= values().length) {
return INVALID;
}
return values()[index];
}
}
Это только пример - в любом случае, это обычно зависит от диапазона значений, которые вы получаете от вашего getIndex()
метод, и как вы хотите сопоставить их с элементами перечисления.
Вы можете использовать его как
switch(Index.valueOf(service.getIndex())) {
case ZERO : ... break;
...
case REG : ... break;
...
}
Смотрите также Cast Int для перечисления в Java для некоторой дополнительной информации (особенно подсказка, что values()
является дорогостоящей операцией, поскольку она должна возвращать копию массива каждый раз, когда он вызывается).
Если вы хотите, чтобы конкретные числовые значения присваивались перечислениям, отправляйтесь так
enum MyReg {
REG(8), OTHER(13);
public final int value;
MyReg(int value) {
this.value=value;
}
}
Затем вы используете это так:
class Test {
public static void main(String[] args) {
MyReg reg = MyReg.REG;
switch (reg) {
case OTHER:
System.out.println(reg.value);
break;
case REG:
System.out.println(reg.value);
break;
}
}
}