替代if else 的方法---巧用枚举类和抽象方法

枚举还能这么玩?用它彻底干掉丑陋的 if-else 链,代码瞬间清爽 通过注解标记 “状态 - 策略类” 的映射关系,再通过反射动态获取策略实例,进一步简化配置。 阅读详情

替代if else 的方法—巧用枚举类和抽象方法

使用场景:当接收到一些数据需要对其进行处理时,由于它们来自于不同的渠道(如:腾讯,巨量),不同渠道所需的处理方式不同,下面来写一个简单Demo来展示。

场景复现

  1. 首先构建一个 GeneralChannelRule 基础规则抽象类,定义一个抽象方法process(),不同的渠道都需要实现该抽象方法。
package com.cyc.basic.test.rule;

public abstract class GeneralChannelRule {
    /**
     * 处理逻辑
     */
    public abstract void process();
}
  1. 编写一个腾讯的规则类,设计对来及腾讯渠道的数据进行处理逻辑
package com.cyc.basic.test.rule;

public class TencentChannelRule extends GeneralChannelRule {
    @Override
    public void process() {
        // 腾讯处理逻辑
    }
}
  1. 编写一个巨量的规则类,定义具体对于巨量数据的处理逻辑
package com.cyc.basic.test.rule;


public class OceanEngineChannelRule extends GeneralChannelRule{
   @Override
    public void process() {
        // 巨量处理逻辑
    }
}
  1. 建立一个简单的枚举类
package com.cyc.basic.test.rule;

import lombok.Getter;

@Getter
public enum ChannelRuleEnum {
    /**
     * 巨量
     */
    OCEANENGINE("OCEANENGINE"),
    /**
     * 腾讯
     */
    TENCENT("TENCENT");

    public String code;

    ChannelRuleEnum(String code) {
        this.code = code;
    }
}
  1. 使用规则对数据进行处理。
package com.cyc.basic.test.rule;

import com.cyc.common.exception.ServiceException;

public class ProcessTest {
    public static void main(String[] args) {
        //模拟接收到的数据,其渠道为为巨量(OCEANENGINE),来自巨量的数据
        String sign = "OCEANENGINE";
        GeneralChannelRule rule;
        //根据对应渠道获取相应的具体规则实现类
        if (ChannelRuleEnum.TENCENT.code.equals(sign)) {
            rule = new TencentChannelRule();
        } else if (ChannelRuleEnum.OCEANENGINE.code.equals(sign)) {
            rule = new OceanEngineChannelRule();
        } else {
            //匹配不到,执行其他处理逻辑...
            throw new ServiceException("400", "传参有误");
        }
        //执行对应的数据处理
        rule.process();
    }
}

解析:如果通过上面的方式,则存在则两个缺点。

当我们需要新增新的渠道的时候,需要对main方法中的逻辑进行修改调整。这违背了设计模式中的开放封闭规则。开放封闭原则的核心的思想是软件实体是可扩展,而不可修改的。

也就是说,对扩展是开放的,而对修改是封闭的

新增渠道后,修改代码会产生大量的if else,后期维护起来很费劲。为了解决以上两个问题,可以借助枚举类来巧妙优化。

使用枚举处理

  1. 下面调整一下枚举类,枚举类中增加一个GeneralChannelRule属性,并且给对应渠道构建对应的GeneralChannelRule实现类,枚举类中新增一个matchRule() 匹配方法。
package com.cyc.basic.test.rule;

import lombok.Getter;

/**
 * @author fei
 */

@Getter
public enum ChannelRuleEnum {
    /**
     * 巨量
     */
    OCEANENGINE("OCEANENGINE"),
    /**
     * 腾讯
     */
    TENCENT("TENCENT");

    public String code;

    public GeneralChannelRule channel;

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

    //匹配规则
    public static ChannelRuleEnum matchRule(String code){
        ChannelRuleEnum[] values = ChannelRuleEnum.values();
        for (ChannelRuleEnum value : values) {
            if(value.code.equals(code)){
                return value;
            }
        }
        return null;
    }

    ChannelRuleEnum(String code) {
        this.code = code;
    }
}

2、改写程序

public class ProcessTestNew {
    public static void main(String[] args) {
        String sign = "TOUTIAO";
        ChannelRuleEnum channelRule = ChannelRuleEnum.matchRule(sign);
        if (Objects.isNull(channelRule)) {
            throw new ServiceException("400", "没有匹配上对应规则");
        }
        GeneralChannelRule rule = channelRule.channel;
        rule.process();
    }
}

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

可以减少if -else使得代码更加简介,后期如果需要新增渠道,只需要在编写具体规则实现类并继承GeneralChannelRule抽象类,并在枚举类中新增的对应枚举,而不需要改动原先的任何代码。符合开发封闭原则。

物联网定位技术|实验报告|实验一 Wi-Fi指纹定位 全球定位系统是迄今为止应用最为成功的地位系统,具备高精度的定位能力,但在室内和高楼密布的城区等信号遮挡严重的密集环境中,由于接受机捕获不到足够强度的卫星信号,GPS的定位质量难以保证甚至无法完成定位,使其可用性受到严重制约。由于室内环境下都普及了WiFi,因此利用WiFi进行定位无需额外部署硬件设备,是一个非常节省成本的方法。 阅读详情

相关推荐

使用枚举的方式代替if else

应用场景 在需要做判断再进行逻辑操作的地方 例如: 需要记录用户在小程序点击事件的详情 如果用if else String name = ""; String staff = ""; String content = ""; if (actionCode.equals("1001")) {//查看名片 content = name +"查看了"+staff +"的名片"; } else if (actionCode.equals("1002")) {//

SetAge_18的博客 1441

Fastwhisper + Pyannote 实现 ASR + 说话者识别

最近在研究ASR相关的业务,也是调研了不少模型,踩了不少坑,ASR这块,目前中文普通话效果最好的应该是阿里的modelscope上的中文模型了,英文的话,还是非whisper莫属了,而且whisper很变态,粤语效果也还不错,因此,如果实际业务中需要涉及到不同的语言,还是更推荐whisper多一点faster-whisper是使用CTranslate2对OpenAI的Whisper模型的重新实现,CTranslate2是一个用于Transformer模型的快速推理引擎。

qq_44193969的博客 1万+

巧妙替代 if - else 的方案之枚举

场景:当我们的项目中需要接收到一些数据并且需要对其进行处理时,由于它们来自于不同的渠道(如:阿里、腾讯),不同渠道所需要的处理方式不同,下面我们写一个常见的Demo来实现该场景。 1、首先,构建一个基础规则的抽象类 GeneralChannelRule,定义一个抽象方法process(),不同的渠道都需要实现该抽象方法。 public abstract class GeneralChannelRule { public abstract void process(); } 2、建立一个.

Ant 1275

scratch航天梦主题课程作品分享,包含ppt、素材包

而今年多国都将发射探测器尝试登陆月球,2023年或将称为“登月年”,请大家发挥创新思维,以“星辰大海”为创作主题,搜集相关信息 、展开联想,为实现升空 、探测 、取样贡献创意!即使去淘宝买的素材,也要从百度网盘,但素材太多大了或者太多文件,也要充值百度网盘超级会员才能保存,提高下载速度。同学们大家好,今天我们就要开始航天主题-嫦娥五号探月工程系列的编程课程了,不仅可以学习到很多航天知识,了解本次嫦娥五号的发射历程,还能让我们用编程遨游太空呢。即使下载了,也要上传,不是特别方便,尤其是不好查找。

少儿编程吕口口 2481

从XSA到Linux应用:Petalinux与Vitis的嵌入式开发全流程解析

本文详细解析了从XSA文件到Linux应用的嵌入式开发全流程,重点介绍了Petalinux与Vitis工具链的使用技巧和实战经验。通过XSA硬件描述、Petalinux工程搭建、系统镜像优化及Vitis开发配置等关键步骤,帮助开发者高效完成ZYNQ平台开发,解决常见问题并提升开发效率。

weixin_29195217的博客 189

Java中如何替换掉if-else(策略+枚举)

以上便是策略+枚举来解决if-else的方法,这样写代码耦合度变低了,也更加简洁了,扩展性也很强,比如以后有了个星期八(只是举个例子),是不是我们只需要,在枚举中再创建一个实例,就不用改代码了。举个例子吧,比如说每周有7天,我每天都回家做不同的菜,根据入参1-7代表周一到周日,提醒我今天该做什么菜了,那么我们就使用if-else来实现的话,代码是这样的。这样我们就可以根据不同的dayOfWeekValue获取到相应的枚举了,接下来的步骤就是重点了,我们在枚举中定义一个抽象方法,作为做菜的行为。

qq_45004609的博客 2160

5G NR 物理层 流程一:从帧结构到TB块,PDSCH/PUSCH 资源映射与TBS计算实战

本文详细解析了5G NR物理层流程,从帧结构到TB块的计算,重点介绍了PDSCH/PUSCH资源映射与TBS计算的实战方法。通过具体案例和公式推导,帮助工程师掌握5G NR资源分配、MCS选择及TBS量化过程,解决实际部署中的常见问题。

weixin_30897233的博客 94

枚举代替if-else控制操作与状态

在涉及状态流转类操作的业务中,通常都需要控制 `操作` 和 `状态` 的对应关系,以控制数据在某些状态下可以进行哪些操作,哪些操作不被允许,如果是比较复杂的业务,可能会通过流程引擎控制,但如果是一般的状态控制,则可以通过状态转换和操作的对应关系去控制。

u011447403的专栏 806

PostgreSQL:Patroni 高可用架构,基于etcd的自动故障转移集群

本文详细介绍了基于Patroni和etcd构建PostgreSQL高可用集群的方案。Patroni作为外部守护进程,通过etcd分布式协调服务实现自动故障转移、主节点选举等关键功能,弥补了PostgreSQL原生缺乏自动故障转移的不足。文章涵盖核心架构(3节点PG+3节点etcd)、环境规划、etcd集群部署(包括配置验证)以及Patroni安装配置的关键步骤,特别强调了Patroni自动初始化PG实例、配置同步复制等生产级特性。该方案通过外部组件协同工作,在不修改PG源码的情况下实现了生产环境所需的高可用

数据知道的博客 2486

R 语言 ggplot2 绘制精美高级全球地图

在本教程中,我们将学习如何使用R语言和ggplot2包绘制精美高级地图。ggplot2是一个功能强大的数据可视化包,它可以让我们创建漂亮、交互式的地图。我们将使用R中的一些其他包来处理地理空间数据,以便与ggplot2无缝协作。

Mrrunsen的博客 1866

【代码优化】使用枚举替代 if/else 和 switch-case 语句的实践

使用枚举替代 if/else 和 switch-case 语句是一种提升代码可读性、可维护性和扩展性的有效方法。通过将不同的逻辑分支封装在枚举实例中,代码变得更加简洁,符合开闭原则,并且能够减少重复代码和潜在的错误。尽管如此,开发者在使用这种方法时仍需权衡其适用性,确保它适用于当前的开发场景。通过实践和不断优化,开发者可以充分利用枚举的强大功能,编写出更具结构化、扩展性和维护性的代码,提升整体的开发效率和代码质量。

发现问题,面对问题,分析问题,解决问题,总结问题 2218

在RV1126上实现人脸识别----MobileFaceNet转成rknn模型

目录 1.模型下载 2 转成rknn模型并推理 3 查看网络模型 1.模型下载 首先下载MobileFaceNet的模型,github下载地址为:https://github.com/sirius-ai/MobileFaceNet_TF/tree/master/arch/pretrained_model/ 2 转成rknn模型并推理 import numpy as np import cv2 from rknn.api import RKNN if __name__ == '__..

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 3525

代码中如何干掉太多的if else即if else的多种替代方案以提高代码质量通过公司代码审查

if...else控制语句,如果代码里滥用会大大降低代码的可读性、可维护性、可扩展性以及灵活性,进而使整个软件系统造成危害。因为在实际的项目中,需求往往是不断变化的,新需求也层出不穷,因此违反了违反单一职责原则和开闭原则,而且有些公司的代码审查会通不过。所以,if else的替代方案是很有必要的,如位语句,枚举,工厂模式,策略模式,状态模式等等

qq_41889508的博客 5万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java8 lambda 替代if-else

java8 lambda 替代if-else 普通 if语句 enum Type { APPLE("apple"), ORANGE("orange"), PEAR("pear"), OTHER("other"); private final String type; Type(String type) { ...

AcceptedLin的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

if-else深度优化:巧用状态变更枚举类

笔者的博客园地址,有更多Java开发干货:https://www.cnblogs.com/amberJava/ if-else深度优化:巧用状态变更枚举类: https://www.cnblogs.com/amberJava/p/12974976.html

dawangpeng2008的专栏 623

不要再写if...else了,优雅的处理

使用场景 项目中出现大量的if…else的判断,根据传参不同做不同的实现,这样就会显的代码很臃肿,耦合性高。 消除if…else的方法有很多,包括命令模式、规则引擎、简单工厂等。接下来会介绍的一种方法是使用枚举来处理这样的大量判断。 使用枚举消除if…else 1、首先定义一个枚举类Operator,枚举类里面需要定义一个方法public abstract String excute(String...

泉的博客 2840

使用枚举代替if else和switch

枚举是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁,安全性以及便捷性。创建枚举类型要使用enum关键字,隐含了所创建的类型都是java.lang.Enum类的子类(java.lang.Enum是一个抽象类)。枚举类型符合通用模式Class Enum>,而E表示枚举类型的名称。

猪头泽兜兜的 842

如何优雅地写出if else代码

如何优雅地写出if else代码

qq_52723253的博客 1718

枚举替代if...else

问题引入:当需要做大量的if...else判断时,比如做天气预报,下面为if..else的代码 String weather = "rain"; new WeatherEnumDemo().broadcastWeather(name, weather); if (weather.equals("rain")) { System.out.println("下雨了"); } else if (weather.equals("sun

gudaichaoren的博客 593

c替代if else_答应我,别再if/else走天下了可以吗

作者:hansonwong99 来自:CodeSheep 哎,曾几何时 想当年,其实我也特别钟情于 if/else连环写法,上来就是一顿SAO操作,比如举个好理解的简单栗子:一般来说我们正常的后台管理系统都有所谓的角色的概念,不同管理员权限不一样,能够行使的操作也不一样,比如:系统管理员( ROLE_ROOT_ADMIN):有 A操作权限订单管理员( ROLE_ORDER_ADMIN):有 B操作...

weixin_34864191的博客 434

Java 中如何使用枚举来消除 if/else

枚举是什么意思呐?百度百科的说法是这样的:在数学和计算机科学理论中,一个集的「枚举」 是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。是一个被命名的整型常数的集合。枚举在日常生活中很常见,例如表示星期的SUNDAYMONDAYTUESDAYWEDNESDAYTHURSDAYFRIDAYSATURDAY就是一个枚举。定义枚举类的关键字是 enum, 枚举类对象不能通过 new 出来,里面的SUNDAYMONDAY...

jj1245_的博客 922

[超详细-Java进阶] 枚举类代替if-else

问题的背景是我要判断不同时段吃早餐还是晚餐,例如1的时候吃早餐,2的时候吃晚餐,3的时候。。这样下来容易嵌套很多层if-else,为了代码整洁,也是java进阶开发,我使用了枚举Enum。

weixin_54582712的博客 710

SpringBoot 中优化 if-else 语句的七种方法实战

大家好,我是默语,擅长全栈开发、运维和人工智能技术。在我的博客中,我主要分享技术教程、Bug解决方案、开发工具指南、前沿科技资讯、产品评测、使用体验、优点推广和横向对比评测等内容。今天,我们将深入探讨如何在 SpringBoot 中优化 if-else 语句。随着代码复杂性的增加,传统的 if-else 语句往往会导致代码难以维护和扩展。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 3万+

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

来源:https://0x9.me/TLxSj场景:当我们接收到一些数据需要对其进行处理时,由于它们来自于不同的渠道(如:腾讯,头条),不同渠道所需的处理方式不同,下面我们写一个简单De...

JAVA葵花宝典 363
上一篇: linux相关命令之top命令
下一篇: 替代 if else ---策略模式
意田天
博客等级 码龄7年 41粉丝 89原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

意田天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值