Java中如何解决if-else(策略+枚举)

最近接到了一个新需求,按照不同的编码去执行不同的逻辑,但最后返回的数据类型是一致的,都是相同对象的List集合。
完成这个需求的话可以使用if-else来执行不同的方法,虽然if-else可以实现,但if-else是一种面向过程的实现。虽然这个需求中编码是固定的,但是编码也太多了,如果用if-else写出来可读性估计也不高。
这个时候就想到之前无意中看到过一篇文章,文章的大致内容,就是使用策略+枚举的方式去解决if-else。正好今天用到了,那么就展开说说怎么使用策略+枚举的方式怎么来替换掉if-else吧.

举个例子吧,比如说每周有7天,我每天都回家做不同的菜,根据入参1-7代表周一到周日,提醒我今天该做什么菜了,那么我们就使用if-else来实现的话,代码是这样的。

public static void main(String[] args) {//获取今天是周几LocalDate today = LocalDate.now();DayOfWeek dayOfWeek = today.getDayOfWeek();int dayOfWeekValue = dayOfWeek.getValue();if(dayOfWeekValue == 1){System.out.println("今天是周一,今天做农家一碗香。");}else if(dayOfWeekValue == 2){System.out.println("今天是周二,今天做鱼香肉丝。");}else if(dayOfWeekValue == 3){System.out.println("今天是周三,今天做韭菜鸡蛋。");}else if(dayOfWeekValue == 4){System.out.println("今天是周四,今天做回锅肉。");}else if(dayOfWeekValue == 5){System.out.println("今天是周五,今天做蛋炒饭。");}else if(dayOfWeekValue == 6){System.out.println("今天是周六,今天做麻婆豆腐。");}else if(dayOfWeekValue == 7){System.out.println("今天是周日,今天做土豆丝。");}else{throw new ServiceException("今天是周几,今天做什么菜?");}}

如果我们用枚举+策略去实现呢?
首先我们先定义一个这样的枚举

@Getter
public enum DoTheCookingEnum {MONDAY(1),TUESDAY(2),WEDNESDAY(3),THURSDAY(4),FRIDAY(5),SATURDAY(6),SUNDAY(7);/*** @description: 周几的数字表达形式**/public final int dayOfWeekValue;private DoTheCookingEnum(int dayOfWeekValue) {this.dayOfWeekValue = dayOfWeekValue;}}

包含了参数,构造器以及周一到周日对应的枚举实例,并使用了Lombok生成了dayOfWeekValue参数的get方法。参数dayOfWeekValue对应的是1-7的条件,接着我们在枚举中定义一个根据dayOfWeekValue参数来获取枚举的方法。

	/*** @description: 根据dayOfWeekValue来获取不同的枚举* @author: Vinci* @date: 2024/3/15 13:08**/public static DoTheCookingEnum getEnum(int dayOfWeekValue) {for (DoTheCookingEnum doTheCookingEnum : DoTheCookingEnum.values()) {if (doTheCookingEnum.dayOfWeekValue == dayOfWeekValue) {return doTheCookingEnum;}}return null;}

这样我们就可以根据不同的dayOfWeekValue获取到相应的枚举了,接下来的步骤就是重点了,我们在枚举中定义一个抽象方法,作为做菜的行为。

	/*** @description: 做菜* @author: Vinci* @date: 2024/3/15 13:12**/public abstract void cooking();

定义了做菜的抽象方法后,我们就可以在每个枚举实例当中去重写cooking()这个抽象方法。

MONDAY(1) {@Overridepublic void cooking() {System.out.println("今天是周一,今天做农家一碗香。");}
},
TUESDAY(2) {@Overridepublic void cooking() {System.out.println("今天是周二,今天做鱼香肉丝。");}
},
WEDNESDAY(3) {@Overridepublic void cooking() {System.out.println("今天是周三,今天做韭菜鸡蛋。");}
},
THURSDAY(4) {@Overridepublic void cooking() {System.out.println("今天是周四,今天做回锅肉。");}
},
FRIDAY(5) {@Overridepublic void cooking() {System.out.println("今天是周五,今天做蛋炒饭。");}
},
SATURDAY(6) {@Overridepublic void cooking() {System.out.println("今天是周六,今天做麻婆豆腐。");}
},
SUNDAY(7) {@Overridepublic void cooking() {System.out.println("今天是周日,今天做土豆丝。");}
};

枚举完整代码如下:

package com.example.demo.enums;import lombok.Getter;/*** @package: com.example.demo.enums* @FileName: DoTheCookingEnum* @author: Vinci* @description: 周几做什么菜* @date: 2024/3/15 11:42*/
@Getter
public enum DoTheCookingEnum {MONDAY(1) {@Overridepublic void cooking() {System.out.println("今天是周一,今天做农家一碗香。");}},TUESDAY(2) {@Overridepublic void cooking() {System.out.println("今天是周二,今天做鱼香肉丝。");}},WEDNESDAY(3) {@Overridepublic void cooking() {System.out.println("今天是周三,今天做韭菜鸡蛋。");}},THURSDAY(4) {@Overridepublic void cooking() {System.out.println("今天是周四,今天做回锅肉。");}},FRIDAY(5) {@Overridepublic void cooking() {System.out.println("今天是周五,今天做蛋炒饭。");}},SATURDAY(6) {@Overridepublic void cooking() {System.out.println("今天是周六,今天做麻婆豆腐。");}},SUNDAY(7) {@Overridepublic void cooking() {System.out.println("今天是周日,今天做土豆丝。");}};/*** @description: 周几的数字表达形式**/public final int dayOfWeekValue;private DoTheCookingEnum(int dayOfWeekValue) {this.dayOfWeekValue = dayOfWeekValue;}/*** @description: 根据dayOfWeekValue来获取不同的枚举* @author: Vinci* @date: 2024/3/15 13:08**/public static DoTheCookingEnum getEnum(int dayOfWeekValue) {for (DoTheCookingEnum doTheCookingEnum : DoTheCookingEnum.values()) {if (doTheCookingEnum.dayOfWeekValue == dayOfWeekValue) {return doTheCookingEnum;}}return null;}/*** @description: 做菜* @author: Vinci* @date: 2024/3/15 13:13**/public abstract void cooking();}

枚举定义完成后,我们就可以去调用不同枚举元素来实现不同的逻辑了。

public static void main(String[] args) {//获取今天是周几LocalDate today = LocalDate.now();DayOfWeek dayOfWeek = today.getDayOfWeek();int dayOfWeekValue = dayOfWeek.getValue();//调用getEnum根据dayOfWeekValue获取枚举对象DoTheCookingEnum anEnum = DoTheCookingEnum.getEnum(dayOfWeekValue);//执行做菜方法,获取今天做什么菜if(anEnum != null){anEnum.cooking();}}

因为今天是周五,所以今晚做蛋炒饭了:
在这里插入图片描述
以上便是策略+枚举来解决if-else的方法,这样写代码耦合度变低了,也更加简洁了,扩展性也很强,比如以后有了个星期八(只是举个例子),是不是我们只需要,在枚举中再创建一个实例,就不用改代码了。当然还有很多种避免使用if-else的方法,欢迎小伙伴们一起讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB——linux中yum命令安装及配置

一、创建mongodb-org-3.4.repo文件 vi /etc/yum.repos.d/mongodb-org-3.4.repo 将下面内容添加到创建的文件中 [mongodb-org-3.4] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.4/x86_64/ gpgcheck1 enabled1 gpgkeyhttps://www…

本地用AIGC生成图像与视频

最近AI界最火的话题,当属Sora了。遗憾的是,Sora目前还没开源或提供模型下载,所以没法在本地跑起来。但是,业界有一些开源的图像与视频生成模型。虽然效果上还没那么惊艳,但还是值得我们体验与学习下的。 Stable Diffu…

Ubuntu Linux - Primavera P6 EPPM 安装及分享

引言 根据计划,近日我制作了基于Ubuntu Linux 的P6虚拟机环境,同样里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机,请先与Oracle Primavera销售代表取得联系,以获取所需的应…

无人机助力智慧农田除草新模式,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建无人机航拍场景下的农田杂草检测识别系统

科技发展到今天,无人机喷洒药物已经不是一件新鲜事情了,在很多高危的工作领域中,比如高空电力设备除冰,电力设备部件传送更换等等,无人机都可以扮演非常出色的作用,前面回到老家一段时间,最近正…

吴恩达deeplearning.ai:使用多个决策树随机森林

以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏 文章目录 为什么要使用树集合使用多个决策树(Tree Ensemble)有放回抽样随机森林XGBoost(eXtream Gradient Boosting)XGBoost的库实现何时使用决策树决策树和树集合神经网络 使用单个决策树的…

【开源】SpringBoot框架开发房屋出售出租系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 房屋销售模块2.2 房屋出租模块2.3 预定意向模块2.4 交易订单模块 三、系统展示四、核心代码4.1 查询房屋求租单4.2 查询卖家的房屋求购单4.3 出租意向预定4.4 出租单支付4.5 查询买家房屋销售交易单 五、免责说明 一、摘…

短视频矩阵系统/短视频矩阵系统技术saas研发

短视频矩阵系统SaaS研发是一个复杂且需要技术专业知识的工作。以下是一些关键步骤和建议,帮助你开发一个成功的短视频矩阵系统SaaS: 1. 明确需求:首先,你需要明确你的短视频矩阵系统的具体需求,例如用户规模、视频内容…

数据库——书籍+内容0.1版本

背景:将一本书,存入我们的数据库中,并可以查出来 采用:第三范式(3NF)设计模式 设计数据库模板 第一范式(1NF):确保表的每一列都是不可分割的原子数据项。 第二范式&…

软件测试-------Web(性能测试 / 界面测试 / 兼容性测试 / 安全性测试)

Web(性能测试 / 界面测试 / 兼容性测试 / 安全性测试) 一、Web性能测试:(压力测试、负载测试、连接速度测试)1、压力测试:      并发测试 (如500人同时登录邮箱) 2、负载测试…

上位机图像处理和嵌入式模块部署(qmacvisual结束判断)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在qmacvisual软件当中,这个判断结束很容易会给大家造成误会,因为它会让大家认为,这和是判断语句一起使用的。但…

PaaS家族的中坚力量——aPaaS

aPaaS是什么?接下来无雀科技为大家介绍一下。aPaaS作为一种先进的云服务模式,为用户提供了无缝的应用程序和部署环境。以SDK、API以及构建的组件为基础,通过零代码或低代码的方式大大地降低了软件开发的技术门槛,使得业务人员不需…

智慧能源管理系统在大学校园的应用-安科瑞 蒋静

1 背景 为贯彻落实《中共中央国务院关于完整准确全面贯彻新发展理念做好碳达峰碳中和工作的意见》和《国务院关于印发2030年前碳达峰行动方案的通知》要求,把绿色低碳发展纳入国民教育体系。 2 传统模式的痛点 传统项目模式下的系统方案缺乏整体的能源监测和管控…

信息系统项目管理(第四版)(高级项目管理)考试重点整理 第14章 项目沟通管理(四)

博主2023年11月通过了信息系统项目管理的考试,考试过程中发现考试的内容全部是教材中的内容,非常符合我学习的思路,因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家,希望更多的人能够通过考试&a…

Java面试题合集-史上最全

3月4月又到了一年一度的跳槽黄金期,无论几年经验,也无论技术能力如何,跳槽前都离不开面试准备,其中刷面试题是重中之重。 刷面试题的时候一大痛点就是太分散了,需要自己根据知识点一项一项的去搜,容易遗漏…

MySQL语法分类 DQL(5)分组查询

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…

全网最详细的自动化测试(Jenkins 篇)

学习 Jenkins 自动化测试的系列文章 Robot Framework 概念Robot Framework 安装Pycharm Robot Framework 环境搭建Robot Framework 介绍Jenkins 自动化测试 1. Robot Framework 概念 Robot Framework是一个基于Python的,可扩展的关键字驱动的自动化测试框架。 …

git:码云仓库提交以及Spring项目创建

git:码云仓库提交 1 前言 码云访问稳定性优于github,首先准备好码云的账户: 官网下载GIT,打开git bash: 查看当前用户的所有GIT仓库,需要查看全局的配置信息,使用如下命令: git …

力扣L13--- 409.最长回文串(JAVA版)-2024年3月1日

1.题目描述 2.知识点 注1:向下取整是将一个数值向下舍入到最接近的整数,但不超过这个数值的整数。具体规则如下: 对于正数,向下取整后得到的整数是不大于原数值的最大整数; 对于负数,向下取整后得到的整数…

深入浅出 Spring:核心概念和基本用法详解

个人主页:17_Kevin-CSDN博客 收录专栏;《Java》 一、引言 在 Java 企业级应用开发中,Spring 框架已经成为了事实上的标准。它提供了一种轻量级的解决方案,使得开发者能够更轻松地构建灵活、可扩展的应用程序。在本文中&#xff0c…

基于springboot+vue实现艺术水平考级报名系统【项目源码+论文说明】计算机毕业设计

基于springbootvue实现艺术水平考级报名系统演示 摘要 本次毕业设计基于SpringBoot框架开发了一款艺术水平考级报名管理系统。该系统为考生提供了线上报名、准考证管理等核心功能,并为系统管理员提供了在线发布考试信息、对报名考生进行审核等管理功能。通过该系统…