在java开发中,往往避免不了通过判断多种状态,做不同的业务处理。如果if-else嵌套层太多,则会造成代码的可读性降低以及后期的维护难度升高。
if (event.getEventType() == 1){
//do something
}else if (event.getEventType() == 2){
//do something
}else if (event.getEventType() == 3){
//do something
}else {
//do something
}
可以看到上述代码,if-else里面又嵌套了一层if-else,每个分支都会有不同的业务逻辑处理,这样的好处就是编写代码的时候实现较为简单,方便,但等到后续遇到需求更改或者需要维护的时候,会发现难以维护。下面,我们直接进入优化方法的讲解:
这个是比较基本的方法,适用于每个分支处理都比较复杂的方法,将业务逻辑单独提取出去可以让分支易读性增加,但是整体的易读性还是很低。
public static void handlerA(){
//do something
}
service层代码可以改写为
if (event.getEventType() == 1){
handlerA();
}else if (event.getEventType() == 2){
handlerB();
}else if (event.getEventType() == 3){
handlerC();
}else {
handlerOther();
}
这种方法可以将繁杂的业务代码和判断分支剥离,但并不能优化到service层的if-else分支。
多态方法,就是定义一个父类Executor,抽取共同属性和方法,然后让各个分支作为子类去重写业务逻辑处理代码。
父类:
public abstract class HandlerExecutor {
// 子类可重写该方法
public void process(Event event) {
}
}
子类:
public class HandlerAExecutor extends HandlerExecutor{
@Override
public void process(Event event) {
}
}
利用工场模式定义一个工厂类来生成不用的子类Executor处理判断分支:
public static TestFlowInfoExecutor executor(Event event) {
HandlerExecutor handlerExecutor = null;
if (event.getEventType() == 1){
handlerExecutor = new HandlerAExecutor();
}else if (event.getEventType() == 2){
handlerExecutor = new HandlerBExecutor();
}else if (event.getEventType() == 3){
handlerExecutor = new HandlerCExecutor();
}else {
handlerExecutor = new HandlerOtherExecutor();
}
return null;
}
最后,service层处理方式:
TestFlowInfoExecutor testFlowInfoExecutor = null;
testFlowInfoExecutor .process(event);
多态+工场方式,可以很好降低各个分支的业务处理逻辑代码和service层的耦合,如果有需求改动,则新增一个子类即可解决,在一定程度增加了可维护性。
先定义一个handle类,将业务逻辑代码抽取到此类。
public class TestHandler {
private boolean isHandled = false;
public void handleA(Event event){
if (event.getEventType() ==1){
//do something
}
}
public void handleB(Event event){
//do something
}
public void handleC(Event event){
//do something
}
public void handleD(Event event){
//do something
}
public void handleOthers(Event event){
//do something
}
private void setSuccess(){
this.isHandled = true;
}
public void resetHandleState(){
this.isHandled = false;
}
public boolean isHandled() {
return isHandled;
}
}
service层处理方式:
TestHandler testHandler = new TestHandler();
//获取到TestHandler的方法
Method[] methods = TestHandler.class.getMethods();
for (Method method : methods){
//找到handle的方法
if (method.getName().startsWith("handle")){
try {
//调用invoke方法找到对应的逻辑处理代码
method.invoke(testHandler , event);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
if (baiduDocHandler.isHandled()){
//处理完毕
baiduDocHandler.resetHandleState();
break;
}
}
通过反射的方法,可以更好地降低代码的耦合性,也方便后续的维护,也是一个不错的选择之一。
本文是主要介绍了三种方法去进行大量if-else的操作,我更喜欢的是使用反射的方法,这种方法不仅可以帮助你了解更多关于反射的底层,代码量上比多态的也更为简便。