2014-02-12 4 views
1

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

public enum MyEnum { 
    VALUE1("value.1"), 
    VALUE2("value.2"); 

    private String value; 
    private MyEnum(String value) { this.value = value; } 

    public String getId() { return id; } 
} 

Я хочу иметь переключатель заявление о значениях перечисления. Что-то вроде следующего:

switch (myString) { 
case MyEnum.VALUE1.getId(): 
    ... 
} 

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

Есть ли способ заставить это работать с заявлением enum и switch? Причина, по которой я добавил значения в перечисление, заключается в том, что я хочу, чтобы некоторые идентификаторы были с символом «.». и другие не разрешенные символы.

+0

Так что некоторые Перечни имеют одинаковый идентификатор? –

+0

Noe, вы можете использовать значения перечисления напрямую ('VALUE1') или использовать строки (« значение.1 »- требуется Java 7) или не использовать' switch' ('if (... getId.equals (. ..)) ' – zapl

+0

Вы действительно хотите найти экземпляр enum с идентификатором? – Bohemian

ответ

6

Добавить статический метод, который принимает String id в качестве параметра и возвращает соответствующие MyEnum:

public enum MyEnum { 
    VALUE1("value.1"), 
    VALUE2("value.2"); 

    private String id; 

    private MyEnum(String value) { 
     this.id = value; 
    } 

    public String getId() { 
     return id; 
    } 

    public static MyEnum fromId(String id){ 
     for(MyEnum e:MyEnum.values()){ 
      if(e.getId().equals(id)){ 
       return e; 
      } 
     } 
     throw new RuntimeException("Enum not found"); 
    } 

    public static void main(String[] args) { 
     String value = "value.2"; 
     switch(MyEnum.fromId(value)){ 
     case VALUE1: 
      System.out.println("ID 1"); 
     break; 
     case VALUE2: 
      System.out.println("ID 2"); 
      break; 
     } 
    } 
} 
+0

У вашего перечисления есть основной метод: это работает? Я никогда не пробовал это. –

+0

Храните 'values ​​()' в своем собственном поле, что повысит эффективность. – Obicere

+1

Да, перечисления имеют почти все те же особенности классов, я включил основной метод в качестве теста. –

0

Идите в другую сторону: вместо поиска каждого идентификатора перечисления в операторах case, посмотрите на перечисление id в инструкции switch.

switch (MyEnum.getEnumById(myString)) { 
case VALUE1: 
    // ./.. 
    break; 
case VALUE2: 
    // ./.. 
    break; 
case VALUE3: 
    // ./.. 
    break; 
} 

Существует несколько способов написать метод getEnumById. This question имеет несколько вариантов.

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