巧用枚举来干掉if-else,代码更优雅!

 代码中大量的if else 无疑会让代码的可读性变差,版本迭代时发现代码可读性太差,写个demo 记录一下。

一、版本一(简单版)

 1、创建执行逻辑枚举类

package com.example.dl.demo3;

/**
 * @author D-L
 * @program: dl
 * @description: 创建执行逻辑枚举类
 * @date 2021-01-15 14:02:43
 */
public enum EnumOperator {
    APP {
        @Override
        public void apply(String name) {
            System.out.println("移动客户端处理逻辑");
        }
    },

    PC {
        @Override
        public void apply(String name) {
            System.out.println("pc端处理逻辑");
        }
    };

    public abstract void apply(String name);
}

2、封装处理逻辑

package com.example.dl.demo3;

/**
 * @author D-L
 * @program: dl
 * @description: 封装处理逻辑
 * @date 2021-01-15 14:01:47
 */

public class GeneralCalculator {
    public void calculate(String name ,EnumOperator operator) {
        operator.apply(name);
    }
}

3、调用

 public static void main(String[] args) {
        String name = "APP";
        GeneralCalculator calculator = new GeneralCalculator();
        EnumOperator operator = EnumOperator.valueOf(name);
        calculator.calculate(name ,operator);
    }

二、版本二(进阶版)

1、首先构建一个 GeneralChannelRule 基础规则抽象类,定义一个抽象方法apply(),不同的渠道都需要实现该抽象方法。

package com.example.dl.demo2;

/**
 * @author D-L
 * @program: dl
 * @description: 首先构建一个 GeneralChannelRule 基础规则抽象类
 * @date 2021-01-15 11:23:56
 */

public abstract class GeneralChannelRule {
    public abstract void apply(String sign);
}

2、实现具体的业务规则

package com.example.dl.demo2;

/**
 * @author D-L
 * @program: dl
 * @description: App移动客户端 处理逻辑
 * @date 2021-01-15 11:24:49
 */

public class AppChannelRule extends GeneralChannelRule {
    @Override
    public void apply(String sign) {
        System.out.println("App移动客户端 处理逻辑");
    }
}
package com.example.dl.demo2;

/**
 * @author D-L
 * @program: dl
 * @description: pc端 处理逻辑
 * @date 2021-01-15 11:25:28
 */

public class PcChannelRule extends GeneralChannelRule {
    @Override
    public void apply(String sign) {
        System.out.println("pc端 处理逻辑");
    }
}

3、枚举类,增加一个GeneralChannelRule属性,并且给对应渠道构建对应的GeneralChannelRule实现类,新增一个match() 匹配方法

package com.example.dl.demo2;

/**
 * @author D-L
 * @program: dl
 * @description: 创建枚举类
 * @date 2021-01-15 11:26:08
 */
public enum ChannelRuleEnum {
    /**
     * APP 移动客户端
     */
    APP("APP",new AppChannelRule()),
    /**
     * PC 网页版
     */
    PC("PC",new PcChannelRule()),
    ;

    public String name;

    public GeneralChannelRule channel;

    ChannelRuleEnum(String name, GeneralChannelRule channel) {
        this.name = name;
        this.channel = channel;
    }

    //匹配
    public static ChannelRuleEnum match(String name){
        ChannelRuleEnum[] values = ChannelRuleEnum.values();
        for (ChannelRuleEnum value : values) {
            if(value.name.equals(name)){
                return value;
            }
        }
        return null;
    }
    public String getName() {
        return name;
    }

    public GeneralChannelRule getChannel() {
        return channel;
    }
}

4、调用


public static void main(String[] args) {
String sign = "APP";
ChannelRuleEnum channelRule = ChannelRuleEnum.match(sign);
if(channelRule == null){
System.out.println("找不到该标识");
return;
}
GeneralChannelRule rule = channelRule.channel;
rule.apply(sign);
}

解析:通过使用枚举类,在枚举中将 key 与 规则具体实现进行绑定。

通过改变:可以减少if -else使得代码更加优雅 如果需要新增渠道,我们只需要在编写具体规则实现类并继承GeneralChannelRule抽象类,并在枚举类中新增的枚举,而不需要改动到原先的任何代码。这符合了开发封闭原则。

原文地址:https://www.cnblogs.com/dongl961230/p/14267531.html