在平时的开发中都会必不可少的用if-else判断逻辑,像以下这种,当判断只有一两层的时候还好,三层以上就看有着有些别扭了,如果判断越来越多,就会变成一个难维护的问题了。
if("RED".equals(color)){
// do something
}else if("GREEN".equals(color)){
// do something
}else if("BLUE".equals(color)){
// do something
}
经过一番摸索和总结,发现可以通过以下几种方式来进行优化,使得代码更加优雅、更加有逼格:
- 对于只有两层判断的可以使用三元运算符来消除;
2、使用switch语句。这种方式其实只是换种写法而已,实际上并没有优化多少。不过当判断层数多的时候倒是switch写法的效率高一些 ;
3、使用Map结合多态模式。这种方式的简单思路就是定义一个接口,在实现该接口的不同类里面来放if-else中不同分支动作,然后用一个map来管理,如下:
Map<String, IColor> map = new HashMap<String, IColor>();
map.put("RED",new RedImpl());
map.put("BLUE",new BlueImpl());
map.put("Green",new GreenImpl());
// 消除if-else用法
map.get(color).doSomething();
4、使用函数式编程。这种方法原理上跟3是一样的,只是这种方法的分支动作采用了Java8中新特性函数式编程来实现,避免了3中每个分支动作一个实现类的写法。
// 维护if-else分支动作
Map<String, IColor> colorMap = new HashMap<>();
colorMap.put("RED", () -> {
System.out.println("这里执行RED对应的逻辑...");
});
colorMap.put("BLUE", () -> {
System.out.println("这里执行BLUE对应的逻辑...");
});
colorMap.put("GREEN", () -> {
System.out.println("这里执行GREEN对应的逻辑...");
});
// 消除if-else用法
colorMap.get(color).doSomething();
5、枚举方式实现,也是个人推荐使用的一种。各分支的状态存放在一个枚举当中,并且使用对应的方法来实现各个状态对应的逻辑,具体如下
public enum ColorEnum {
RED{
@Override
public void doSomething() {
System.out.println("这里执行RED对应的逻辑...");
}
},
BLUE{
@Override
public void doSomething() {
System.out.println("这里执行BLUE对应的逻辑...");
}
},
GREEN{
@Override
public void doSomething() {
System.out.println("这里执行GREEN对应的逻辑...");
}
};
public abstract void doSomething();
}
然后应用时消除if-else的写法就可以像下面这样:
ColorEnum.valueOf(color).doSomething();
好了,代码中消除if-else或者优雅方式实现分支判断流程的就介绍了这几种。其实真正的项目中的场景是灵活多变的,有空值判断的、状态判断的、范围判断等场景,没有哪一种是最好的,只有针对具体场景才能确定的更合适的写法,所以我们都要了解多一些,才能让我们的代码更具有可读性、扩展性。
如果觉得文章对你有点帮助,欢迎微信关注【白话Java】,让我们一起成长吧!
回复“8080”有Java经典喔