我正在尝试编写一种方法,以根据Map内确定的条件从列表中过滤内容。我在Map上编写了一个循环,每次检查是否应将list元素添加到新列表中。我的问题是:在switch语句中,第一种和最后一种情况被视为重复。我的IDE有问题吗?非常感谢您的帮助!
@Override
public boolean match(Person p, Map<String, Object> criteria,SearchMode mode) {
for(Entry<String,Object> es:criteria.entrySet()) {
Object value=es.getValue();
switch(es.getKey()) {
case ID:
if(mode==SearchMode.AND && !Integer.valueOf(p.getId()).equals((Integer)value)) {
return false;
}else if (mode==SearchMode.OR && Integer.valueOf(p.getId()).equals((Integer)value)) {
return true;
}
break;
case USER_NAME:
if(mode==SearchMode.AND && !p.getUserName().equals(value)) {
return false;
} else if(mode==SearchMode.OR && p.getUserName().equals(value)) {
return true;
}
break;
case EMAIL:
if(mode==SearchMode.AND && !p.getEmail().equals(value)) {
return false;
}else if(mode==SearchMode.OR && p.getEmail().equals(value)) {
return true;
}
break;
case PASSWORD:
if(mode==SearchMode.AND && !p.getPassword().equals(value)) {
return false;
} else if(mode==SearchMode.OR && p.getPassword().equals(value)) {
return true;
}
break;
case FIRST_NAME:
if(mode==SearchMode.AND && !p.getFirstName().equals(value)) {
return false;
} else if(mode==SearchMode.OR && p.getFirstName().equals(value)) {
return true;
}
break;
case LAST_NAME:
if(mode==SearchMode.AND && !p.getLastName().equals(value)) {
return false;
}else if(mode==SearchMode.OR && p.getLastName().equals(value)) {
return true;
}
break;
case STATUS:
if(mode==SearchMode.AND && !p.getStatus().equals((Person.Status.valueOf(value.toString())))){
return false;
}else if(mode==SearchMode.OR && !p.getStatus().equals((Person.Status.valueOf(value.toString())))){
return true;
}
break;
}
}
return true;
}
如果两种情况下的业务逻辑都相同,则可以更改此:
switch(type) {
case CASE_1: performA(); break;
case CASE_2: performB(); break;
case CASE_3: performA(); break;
}
显然,CASE_1和CASE_3使用瀑布原理在其中执行相同的代码:
switch(type) {
case CASE_1: // no break statement here
case CASE_3: performA(); break;
case CASE_2: performB(); break;
}
从功能的角度来看,这是相同的,只是您不必担心重复的代码。
但是,保持它的原样没有任何害处,除非您以后必须更新它,而忘记同时更新它们。