2013-05-08 1 views
6

Есть ли способ преобразования перечисления в константное выражение? Я хочу, чтобы мой оператор переключатель, чтобы выбрать среди значений перечисления, но я получил компиляции ошибку «случай выражения должны быть константными выражениями», поэтому я попытался объявить его в переменной:Константные выражения из 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#jls-15.28

времени компиляции константа является выражение, обозначающее значение примитивного типа или строка, которая не завершается внезапно и является компоновать с использованием только следующее:

• литералов примитивного типа и литералов типа String

Так что это не работает, потому что я не использую литерал. Я думаю, что я должен объявить его как:

final int REG = 8; 

Но было бы гораздо лучше, чтобы связать его с перечислением. Есть ли способ сделать это?

EDIT

Оказывается, мне не нужно использовать какие-либо окончательной переменной. Это так же просто, как:

switch (service) { 

case REG: 

Это не произошло со мной, пока я не увидел комментарий Андреа. Спасибо за ваши ответы.

+1

Я предполагаю, что 'service.getIndex()' 'возвращает Integer ', правильно? Можете ли вы изменить его так, чтобы он возвращал ваш enum? –

+1

До версии 1.6 1.6 вы не можете использовать 'String' в' switch-case', но вы можете использовать его в Java 7. FYI – Joshi

ответ

6

Если возможно, измените свой метод getIndex() так, чтобы он возвращал перечисление вместо целого числа. Если это не представляется возможным, вам нужно карты индекса к перечислениям элемента:

Учитывая следующее перечисление:

public enum Index { 
    ONE, 
    TWO, 
    THREE 
} 

можно сопоставить индекс элемента перечислений с помощью

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 to enum in Java для некоторой дополнительной информации (особенно намек, что values() является дорогостоящей операцией, поскольку она должна возвращать копию массива каждый раз, когда его называется).

+0

Это сработало для меня! Большое спасибо! – Mauker

2

Если вы хотите, чтобы определенные счисления значения, присвоенные перечислений constacts идти как этот

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