2016-03-10 2 views
-4

Что будет лучшим способом оптимизации ниже кода?Оптимизация нескольких или операторов для набора <String>

protected void saveUserRoles(Set<String> userRoles) { 
     if (userRoles != null && (userRoles.contains(StaticValues.LUMEN_SELECT_USER_ROLE) 
       || userRoles.contains(StaticValues.EASY_SENSE_USER_ROLE) 
       || userRoles.contains(StaticValues.TLED_USER_ROLE)||userRoles.contains(StaticValues.IR_APP_USER_ROLE))) { 
      preferences.setUserRoles(userRoles); 
     } 
    } 
+2

Почему он нуждается в оптимизации? –

+0

Код, следующий за &&, может быть помещен в коммутатор, который проваливается через – TheLostMind

+0

. Роли пользователя могут расти ... это увеличит число || statements.Thats, почему поиск оптимизации – Nargis

ответ

2

Я предлагаю вам просто сохранить список или массив значений для проверки против:

private static final List USER_ROLES_TO_SAVE = Arrays.asList(
    StaticValues.LUMEN_SELECT_USER_ROLE, 
    StaticValues.EASY_SENSE_USER_ROLE, 
    StaticValues.TLED_USER_ROLE, 
    StaticValues.IR_APP_USER_ROLE); 

protected void saveUserRoles(Set<String> userRoles) { 
    if (userRoles == null) { 
     return; 
    } 
    for (String candidate : USER_ROLES_TO_SAVE) { 
     if (userRoles.contains(candidate)) { 
      preferences.setUserRoles(userRoles); 
      return; 
     } 
    } 
} 

Это сейчас очень легко поддерживать и читать - и, как для работы, если вы только глядя на расширение списка до 8 записей, нет смысла пытаться получить фантазию - я был бы абсолютно удивлен, если бы это стало узким местом, и найти что-либо более быстрое с точки зрения сложности, чем O (N) вряд ли будет полезно, учитывая, насколько малым N является в этом случае.

0

Collections#disjoint() может помочь сделать это более удобным для чтения:

static final Set<String> ROLES_TO_SAVE = new HashSet<String>() {{ 
    add(StaticValues.LUMEN_SELECT_USER_ROLE); 
    add(StaticValues.EASY_SENSE_USER_ROLE); 
    // ... 
}}  

protected void saveUserRoles(Set<String> userRoles) { 
    if (userRoles != null && !Collections.disjoint(ROLES_TO_SAVE, userRoles)) 
     preferences.setUserRoles(userRoles); 
} 
1

Вы могли бы извлечь логику метода с петлей и переменными аргументами (varargs), что-то вроде

private static boolean containsAny(Set<String> userRoles, String... roles) { 
    if (userRoles == null || userRoles.isEmpty()) { 
     return false; 
    } 
    for (String role : roles) { 
     if (userRoles.contains(role)) { 
      return true; 
     } 
    } 
    return false; 
} 

Затем вы можете позвонить по этому адресу

protected void saveUserRoles(Set<String> userRoles) { 
    if (containsAny(userRoles, StaticValues.LUMEN_SELECT_USER_ROLE, 
      StaticValues.EASY_SENSE_USER_ROLE, StaticValues.TLED_USER_ROLE, 
      StaticValues.IR_APP_USER_ROLE))) { 
     preferences.setUserRoles(userRoles); 
    } 
} 
Смежные вопросы