正如Luiggi Mendoza所说,这是对上一个问题的跟进......
如果您使用的是Java 7,则可以对字符串使用switch-case 语句
//month is a String
switch (month.toLowerCase()) {
case "january":
monthNumber = 1;
break;
//partsleft out for sake of brevity ..
default:
monthNumber = 0;
break;
}
(摘自上面引用的 Oracle Java 教程。)
重构
然而,这个巨大的 if-else 只是问题的一部分。由于这似乎是一个随着时间的推移而增长的结构,我建议进行彻底的重构,并使用在我看来是一种策略模式。你应该:
制定一个涵盖所有用例边界的接口:
interface MyStrategy {
void execute(MyInputContext input, MyOutputContext output);
}
(使用带有 MyInputContext 和 MyOutputContext 的 void 方法只是一种方法,这只是一个示例,但是要处理具有响应的请求,这是有道理的,就像 Servlet 的工作方式一样)
将大 IF-ELSE 语句的内容重构为该接口的实例(这些将是策略):
//VERY simplified...
class ReadProfileStrategy implements MyStrategy {
void execute(MyInputContext input, MyOutputContext output) {
//do the stuff that was in the if-else block in the "readProfile" part
}
}
//... at the branching part:
MyInputContext input; //build this here
MyOutputContext output; //build this here
switch (purpose) {
case "readProfile":
// no need to always instantiate this, it should be stateless...
new ReadProfileStrategy().execute();
break;
//... left out for sake of brevity
}
重构步骤 2
如果这样做了,您可以将字符串 ID 添加到接口和实例本身,并完全摆脱 if-else 或 switch 语句,您可以创建一个即使通过 IOC 容器(如)填充的 Map,最新,并且完全灵活。
class ReadProfileStrategy implements MyStrategy {
String getID() {
return "readProfile";
}
void execute(MyInputContext input, MyOutputContext output) {
//do the stuff that was in the if-else block in the "readProfile" part
}
}
在处理请求时的类中
private final Map<String, MyStrategy> strategyMap; //fill the map using your favorite approach, like using Spring application context, using the getCode() to provide the key of the map
在处理逻辑中:
MyStrategy strategy = strategyMap.get(purpose);
if(strategy!=null) {
strategy.execute();
}
else {
//handle error here
}