合理优化《if...else...》

230 阅读4分钟

在我们日常开发中,对于一些业务操作总会有很多的条件判断,判断后也就只会做一些简单的处理,然后我们小白可能就会通过多种if语句进行条件判断:if判断也分为以下几种

If 语句简单介绍

1:使用场景,判断条件只有两种,执行时只选二者其一

if (条件){
    执行语句1;
}else {
    执行语句2;
}

2:使用场景:多个条件需要进行判断,这种最常见,很多时候都要使用,也是当条件太多的时候看着恶心的地方,很想要优化的地方~

if (条件){
    执行语句;
}
if(条件){
    执行语句;
}
...

3:使用场景:同一个条件有多个值,多种情况只取其一,其实我们可以使用上面第二种方法,但是这个方法有一个有点就是如果条件1满足的话就不会再去执行下面的条件判断,直接跳过这个条件的后面所有判断


if(条件1){
    执行语句1;
}else if (条件2){
    执行语句2;
}else if (条件3){
    执行语句3;
}
...
switch case 语句简单介绍

switch case的使用场景和上述的if语句的第三种情况较为相似,同一个条件有多种值并只取其一。

switch case语法如下(注意:switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量):

switch (条件){
    case "value1":   执行语句1;
    break;    //可去掉
    case "value2":   执行语句2;
    break;    //可去掉
    ...
    default:         执行语句3;   //可去掉
}

如上其中所写,其中的break或者default可以选择不要,default的值就是前面所有的值都不符合的时候会默认执行这个默认的语句,一般情况下我们的break不会去掉,因为如果去掉的话条件判断不会在走过第一个条件的执行语句后跳出判断,而继续执行下面的条件判断,当然如果你的执行语句是抛异常或者是return语句的话就不需要在后面加break了,加上的话也会报出编译异常,代码如下(下面的异常是项目中封装的业务异常,不是系统中的异常,系统的异常无法进行正常抛出):

switch (s){
    case "aa":  throw new BusinessException("异常信息");
    case "bb":  throw new BusinessException("异常信息");
    default:    throw new BusinessException("异常信息");
}
switch (s){
    case "aa":  return 1;
    case "bb":  return 2;
    default:    return 3;
}

这个时候我们可以看到,我们在一些特殊的情况下完全可以通过switch case来替代if else 语句,这样的话在条件判断较多的时候代码看起来会更加的简单明了~

策略模式解决方案demo

当然其实很多时候专业的高级开发会说我们可以使用策略模式来优化多余的if else,这个我也研究了一下,也写了个简单的demo,demo代码如下:

public interface Person {
    /**
     * 执行方法
     */
    void action();
}
public class Strategy {

    private Person person;

    public void setPerson(Person person) {
        this.person = person;
    }

    public void execute() {
        person.action();
    }
}
public class LiSi implements Person{
    @Override
    public void action() {
        System.out.println("我是李四");
    }
}
public class ZhangSan implements Person{
    @Override
    public void action() {
        System.out.println("我是张三");
    }
}
public class Print {
    public static void main(String[] args) {
        LiSi liSi = new LiSi();
        Strategy context = new Strategy();
        context.setPerson(liSi);
        context.execute();//我是李四
        Strategy context1 = new Strategy();
        context1.setPerson(new ZhangSan());
        context1.execute();//我是张三
    }
}

其实我们看完之后也大概知道什么意思了,就是我们每多一个条件就需要去新建一个条件类去实现抽象接口,并实现其方法,在重写的方法中写自己独有的业务逻辑,这样的话我们能发现优点就是我们的独有逻辑都分开在不同的业务对象中实现,确实看着比较清晰明了,我这也只是一个小小的简单的demo,方便小白初步去理解,更详细的可看我的另一篇博客: 基于SpringBoot实现策略模式提供系统接口扩展能力,大家可以点击此处移步过去查看,可方便我们在项目中体验到策略模式的快乐~