zoukankan      html  css  js  c++  java
  • 巧用枚举来干掉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抽象类,并在枚举类中新增的枚举,而不需要改动到原先的任何代码。这符合了开发封闭原则。

  • 相关阅读:
    linux 使用crontab定时任务+shell脚本删除tomcat日志elasticsearch日志索引
    【转】Java8 Stream 流详解
    Mongo查询list数组中一个字段大于特定条数
    安装Elasticsearch出现 node validation exception 的问题处理
    mockito使用教程
    rocketmq4.4配置日志路径等级
    使用ResponseBodyAdvice统一包装响应返回String的时候出现java.lang.ClassCastException: com.xxx.dto.common.ResponseResult cannot be cast to java.lang.String
    服务器22端口连接超时 ssh: connect to host *** port 22: Operation timed out
    【JAVA基础】24 递归练习
    【JAVA基础】23 IO流-其他流
  • 原文地址:https://www.cnblogs.com/dongl961230/p/14267531.html
Copyright © 2011-2022 走看看