2014-02-03 3 views
0

У меня есть перечисление, содержащее такие элементы, как DOT_BLUE, DOT_YELLOW, SQUARE_BLUE, SQUARE_YELLOW и т. Д. У меня также есть строка, например String string = "DOT_BLUE". Теперь я хочу получить доступ к перечислению в зависимости от того, что такое строка. Я слишком ленив, чтобы написать все инструкции if else (есть намного больше элементов), и использование отражения в Java сложно, потому что я хочу запустить этот код и на Android.Перечислите тип перечисления со строкой

Так есть ли другой более элегантный способ доступа к моему перечислению в зависимости от того, что такое строка? Я не знаю никого, но я не эксперт по Java. Поэтому я был бы рад четкому ответу, даже если это «Нет».

+6

Вы ищете 'MyEnum.valueOf (имя)'? –

+0

'использование отражения в Java сложно, потому что я хочу запустить этот код на андроиде, а почему? ничто не мешает вам использовать отражение в андроиде. – njzk2

+0

Я только сказал, что это сложно, а не невозможно. – tomet

ответ

1

перечисления имеют метод valueOf (имя строки) в java 6, который может помочь вам.

JavaDoc говорит

«Возвращает константу перечисления указанного перечислимого типа с указанным именем. Имя должно точно соответствовать идентификатору, используемому, чтобы объявить константу перечисления в этом типе.»

Ссылка: Class Enum

public enum Color { 

    DOT_BLUE, DOT_YELLOW, SQUARE_BLUE, SQUARE_YELLOW; 

    public static void main(String[] args) { 
     Color color = Color.valueOf("DOT_BLUE"); 
     System.out.println(color.equals(Color.DOT_BLUE)); 
     System.out.println(color); 
    } 

} 
+0

+1, но было бы неплохо дать какое-то объяснение, а не только код :) –

+0

позвольте мне также привести некоторые объяснения :) –

-1

Как предложил Джон Скит, вы можете использовать MyEnum.valueOf (имя). Другим вариантом является сохранить значение для каждого перечисления:

public enum MyEnum { 
    DOT_BLUE ("blue"), 
    DOT_RED ("red"); 

    private String name; 

    MyEnum(String name) { 
     this.name = name; 
    } 

    // provide a method to get the MyEnum based on some input 
    public static MyEnum getByName(String name) { 
     for (MyEnum myEnum : values()) { 
      if (myEnum.getName().equals(name)) { 
       return myEnum; 
      } 
      throw new IllegalArgumentException("No enum with the provided parameter"); 
     } 
    } 

} 

Этот вариант является более полезным/мощным, когда у вас есть несколько свойств и хотите найти Enum на основе всех из них/некоторые из них.

+1

Было бы неплохо объяснить нижний предел – Anton

-1

Вы можете реализовать что-то вроде этого.

enum Pattern { 
    DOT_BLUE, DOT_YELLOW, SQUARE_BLUE, SQUARE_YELLOW; 

    Pattern fromString(String code) { 
     for(Pattern p : values()) { 
      if(p.toString().equals(code)) return p 
     } 
     return null; 
    } 
} 

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

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