需求:if else 过多,不利于阅读,不够优雅。。。。
背景:曾经有一个项目,我负责系统中工作流部分,系统中大概有差不多快10种流程,当时全局监听器是使用的同一个,然后根据不同的流程编码去调用不同的业务代码,因此写了很多if else ....又不想使用switch....
如下代码优化:
public class StateTest {
public static void main(String[] args) throws Exception {
stateExecute("create");
}
public static void stateExecute(String state){
if("create".equals(state)){
System.out.println("=====新建了===");
}else if("submit".equals(state)){
System.out.println("=====提交了===");
}else if("approved".equals(state)){
System.out.println("=====审批了===");
}else if("refuse".equals(state)){
System.out.println("=====拒绝了===");
}else if("end".equals(state)){
System.out.println("=====结束了===");
}else{
System.out.println("=====状态有误~~~~===");
}
}
public static void newExecute(){
System.out.println("====静态map方法====");
}
}
方案一:静态map
原理:新建静态map,键是状态,值是方法,根据键获取到方法,利用反射执行
class StaticMap{
public static final Map<String,Object> map=new HashMap<>();
//初始化map,key是type,value是方法名
static {
map.put("create", "newExecute");
//。。。。
}
}
执行如下
//静态map调用
Class<?> clz =StateTest.class;
clz.getMethod(methoName, null).invoke(null, null);
方案二:枚举类
原理:新建枚举类,建一个执行的抽象方法,枚举项在进行方法的实现
package opt;
public enum StateEnum {
create {
@Override
public void executeMetho() {
System.out.println("=====枚举--新建了===");
}
},
submit {
@Override
public void executeMetho() {
System.out.println("=====枚举--提交了===");
}
},
approved {
@Override
public void executeMetho() {
System.out.println("=====枚举--审批了===");
}
},
refuse {
@Override
public void executeMetho() {
System.out.println("=====枚举--拒绝了===");
}
},
end {
@Override
public void executeMetho() {
System.out.println("=====枚举--结束了===");
}
};
public abstract void executeMetho();
}
执行如下
//枚举-调用
StateEnum valueOf = StateEnum.valueOf("create");
valueOf.executeMetho();
最后的执行效果如下: