2017-02-20 73 views
1

У меня есть код, который работает отлично, но мне интересно, есть ли лучший способ получить тот же результат.Набор Java содержит несколько вариантов возврата

public enum Status { 
    ENUM1, ENUM2, ENUM3, ENUM4; 

    public static Status getStatus(Set<String> set) { 
     if (set.contains("x")) { 
      return ENUM1; 
     } 
     if (set.contains("y") || set.contains("z")) { 
      return ENUM2; 
     } 
     if (set.contains("c")) { 
      return ENUM3; 
     } 
     return ENUM4; 
    } 
} 

Так что в основном это код (xyzc - все константы). Таким образом, метод принимает набор строк и должен возвращать правильное перечисление. Есть ли лучший способ добиться того же результата?

Редактировать: Это способ, который установлен, никогда не бывает пустым, поэтому не против этой части.

Edit2: надеюсь, что это очищает его ..

+1

ваш код приводит к исключению NullPointerException. Не жалко ... Ваш набор никогда не инициализируется. IDE должна показать вам это. –

+0

Код не компилируется. Вы должны в первую очередь инициализировать переменную. – SachinSarawgi

+1

Нет, это не просто пример. С самого начала набор никогда не бывает пустым. – Rauno

ответ

4

Вы можете рассмотреть инкапсулировать свою логику преобразования внутри состояния перечислимого , Что-то вроде этого:

enum Status{ 
    Option1("x"), 
    Option2("y", "z"), 
    Option3("c"), 
    Default; 

    Status (String ... values){ 
     this.values = values; 
    } 

    String [] values; 

    static Status convert(Set<String> set){ 
     for (Status status : Status.values()) 
      for (String str : status.values) 
       if (set.contains(str)) 
        return status; 
     return Default; 
    } 
} 
1

Вы можете использовать HashMap:

HashMap<String, String> map = new HashMap<>(); 

// init with 
map.put("x", "option 1"); 
map.put("y", "option 2"); 
map.put("z", "option 2"); 
map.put("c", "option 3"); 

Применение:

String option = map.get("x"); 
+0

Вы уверены, что создание нового 'HashMap' и вставка 4 разных значений будет более оптимальным, а затем использовать 3 условных оператора ? –

+0

Наверное, нет, но код будет более чистым и легким для расширения. – Zack

+0

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