优化以下代码的最佳方法是什么?
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);
}
}
答案 0 :(得分: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,它不太可能有用。
答案 1 :(得分: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);
}
}
答案 2 :(得分: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);
}