背景
最近刷手机的时候,总是看到一些文章(if else语句优化),基本都是在讨论,对于一大串的if else语句,该怎么写才能既简单又易读。看了好几篇类似的文章,我也来简单说说我自己的看法。
优化方案
1、策略模式
条件判断语句的优化,大家都知道的一种方式:策略模式,那我就先从策略模式分析。
这里我们先来看看菜鸟教程里面是怎么讲策略模式的,我这里直接截图的菜鸟教程里面的内容。(本人懒)
再来看看它给的例子
步骤 1
创建一个接口。
Strategy.java
public interface Strategy {
public int doOperation(int num1, int num2);
}
步骤 2
创建实现接口的实体类。
OperationAdd.java
public class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
OperationSubstract.java
public class OperationSubstract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
OperationMultiply.java
public class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
步骤 3
创建 Context 类。
Context.java
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}
步骤 4
使用 Context 来查看当它改变策略 Strategy 时的行为变化。
StrategyPatternDemo.java
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
从上面给的实例来看,其实并没有真正意义上的去舍弃if else,还是需要根据条件判断,来获取对应的实例。
当然了,还有一种做法就是将各个实例放入到一个map中,以后可以直接map.get(xx) 来获取到对应的实例,是可以省去if else的判断了。
但是这样做的话,在新增一个条件的时候,我们不仅仅要再去实现一个Strategy接口,还要将这个对象放入到map中,变相的导致了我们编码的复杂度。
所以个人不喜欢使用策略模式。(可能也是我孤陋寡闻,不知道更好的方式)
说了一下个人对策略模式的意见,那我在说说平时,我喜欢使用的方式:java枚举。
2、枚举
这里就不多说了,直接给出例子,更直观。
// 定义了一个枚举
public enum TestEnum {
ONE {
void build() {
System.out.println("ONE");
}
},
TWO {
void build() {
System.out.println("TWO");
}
};
abstract void build();
}
//根据条件调用不同的执行方式
public class Test {
public static void main(String[] args) throws Exception {
TestEnum test = TestEnum.valueOf("ONE");
test.build();
}
}
从上面的内容来看,枚举可能是更好的选择方式(可能还有别的我不知道方式)