简单优化 if else

简单优化 if else

1、 阿里编程归约

if语句使用“卫语句 ”减少层级嵌套。

一脸的大写的懵逼,“卫语句”是什么东东?赶紧找度妈。

卫语句就是把复杂的条件表达式拆分成多个条件表达式,比如一个很复杂的表达式,嵌套了好几层的if - else语句,转换为多个if语句,实现它的逻辑,这多条的if语句就是卫语句.

if(obj != null){
  doSomething();
}
 
//转换成卫语句以后的代码如下:
if(obj == null){
   return;
}
doSomething();

卫语句的好处是条件表达式之间相互独立,不会互扰。

2、数组

场景:定义一个方法,获取星期数。

private static String getWeekDay(int weekStat) {
    if (0 == weekStat) {
        return "星期天";
    }
    if (1 == weekStat) {
        return "星期一";
    }
    if (2 == weekStat){
        return "星期二";
    }
    if (3 == weekStat){
        return "星期三";
    }
    if (4 == weekStat){
        return "星期四";
    }
    if (5 == weekStat){
        return "星期五";
    }
    if (6 == weekStat){
        return "星期六";
    }
    return null;
}

// 使用该方法获取星期六
System.out.println(getWeekDay(6));

使用数组优化:

String[] week = {
    "星期天",
    "星期一",
    "星期二",
    "星期三",
    "星期四",
    "星期五",
    "星期六"
};

// 使用数组获取星期六
System.out.println(week[6])

3、策略设计模式

3.1 枚举实现

定义一个枚举类:

/**
 * 定义了一周的每一天要干什么
 */
enum WeekDay {
    /**星期天要作甚?*/
    Sunday("Sunday"){
        @Override
        void weekRun() {
            System.out.println(weekName + ":和朋友出去玩!");
        }
    },
    /**星期1要作甚?*/
    Monday("Monday"){
        @Override
        void weekRun() {
            System.out.println(weekName + ":在学校学习英语");
        }
    },
    /**星期2要作甚?*/
    Tuesday("Tuesday"){
        @Override
        void weekRun() {
            System.out.println(weekName + ":在学校学习java");
        }
    },
    /**星期3要作甚?*/
    Wednesday("Wednesday"){
        @Override
        void weekRun() {
            System.out.println(weekName + ":在学校学习语文");
        }
    },
    /**星期4要作甚?*/
    Thursday("Thursday"){
        @Override
        void weekRun() {
            System.out.println(weekName + ":在学校学习历史");
        }
    },
    /**星期5要作甚?*/
    Friday("Friday"){
        @Override
        void weekRun() {
            System.out.println(weekName + "在学校玩");
        }
    },
    /**星期6要作甚?*/
    Saturday("Saturday"){
        @Override
        void weekRun() {
            System.out.println(weekName + "和朋友在家看电影");
        }
    };

    public String weekName;
    abstract void weekRun();
    WeekDay(String weekName){
        this.weekName = weekName;
    }
}

使用该枚举类:

public class Demo {
    public static void main(String[] args) {
        // 调用的写法1
        WeekDay.valueOf("Sunday").weekRun();
        // 调用的写法2
        WeekDay.Monday.weekRun();
    }
}

3.2 多态实现

抽象一个跑的行为

/**
 * 跑的行为抽象
 */
@FunctionalInterface
interface RunStrategy {
    void run();
}

针对该行为抽象,有几种实现:

/**
 * 人跑的行为
 */
class PeopleRunStrategy implements RunStrategy {
    @Override
    public void run() {
        System.out.println("人用腿跑");
    }
}

/**
 * 汽车跑的行为
 */
class CarRunStrategy implements RunStrategy {

    @Override
    public void run() {
        System.out.println("汽车用轮子跑");
    }
}

/**
 * 鱼跑的行为
 */
class FishRunStrategy implements RunStrategy {

    @Override
    public void run() {
        System.out.println("鱼在水里游");
    }
}

使用映射来调用:

Map<String, RunStrategy> runStrategyMap = new HashMap<>(16);
runStrategyMap.put("people", new PeopleRunStrategy());
runStrategyMap.put("car", new CarRunStrategy());
runStrategyMap.put("fish", new FishRunStrategy());

// 获取汽车的跑的实现,当没有该实现时,调用人的跑的实现
RunStrategy runStrategy1 = runStrategyMap.getOrDefault("car", new PeopleRunStrategy());
// 获取鸟的跑的实现,当没有该实现时,调用人的跑的实现
RunStrategy runStrategy2 = runStrategyMap.getOrDefault("bird", new PeopleRunStrategy());
// 打印:汽车用轮子跑
runStrategy1.run();
// 打印:人用腿跑
runStrategy2.run();

4、 状态设计模式

抽象状态行为接口:

/**
 * Created by Feng on 2020/1/4 11:37<br>
 *     抽象状态行为:定义不同状态对应的方法
 *     方法的实现由其实现类完成
 */
@FunctionalInterface
interface State {
    void handle();
}

具体的状态类:

/**
 * 具体的状态类:空闲状态
 */
class FreeState implements State {

    @Override
    public void handle() {
        System.out.println("闲着就写代码!!");
    }
}

/**
 * 具体的状态类:繁忙状态
 */
class BusyState implements State {

    @Override
    public void handle() {
        System.out.println("忙了还得写代码!!!");
    }
}

State 上下文:

/**
 * 在环境中维护一个抽象状态类 State 的实例,这个实例定义当前状态。
 * 还可以定义初始状态
 */
class Context {
    private State state;

    /**
     * 设置状态:调用handle方法
     */
    public void setState(State state){
        this.state = state;
        state.handle();
    }

    public State getState(){
        return state;
    }
}

测试:

/**
 * 客户端:测试
 */
public class ContextClient {
    public static void main(String[] args) {
        Context context = new Context();
        context.setState(new FreeState());
        context.setState(new BusyState());
    }
}

测试结果:

  1. 闲着就写代码!!
  2. 忙了还得写代码!!!
原文地址:https://www.cnblogs.com/cchilei/p/13470639.html