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的库实现何时使用决策树决策树和树集合神经网络 使用单个决策树的…

数据预处理在数据挖掘中的重要性

数据挖掘作为从大量数据中提取有用信息和知识的过程,其结果的准确性和可靠性直接受到数据质量的影响。因此,数据预处理在数据挖掘中扮演着至关重要的角色。让我们探讨数据质量对数据挖掘结果的影响,并介绍常见的数据预处理方法以及它们如何提…

2024.3.14每日一题

LeetCode 合并数组中的最大元素 题目链接&#xff1a;2789. 合并后数组中的最大元素 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个下标从 0 开始、由正整数组成的数组 nums 。 你可以在数组上执行下述操作 任意 次&#xff1a; 选中一个同时满足 0 < i …

【开源】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研发是一个复杂且需要技术专业知识的工作。以下是一些关键步骤和建议&#xff0c;帮助你开发一个成功的短视频矩阵系统SaaS&#xff1a; 1. 明确需求&#xff1a;首先&#xff0c;你需要明确你的短视频矩阵系统的具体需求&#xff0c;例如用户规模、视频内容…

力扣100热题:两、三、四数之和,哈希+数组+双指针+排序

目录 一、两数之和 二、两数之和 II - 输入有序数组 三、两数之和 III - 数据结构设计 四、两数之和 IV - 输入 BST&#xff08;二叉搜索树&#xff09; 五、三数之和 六、四数之和 一、两数之和 题目&#xff1a;1. 两数之和 参考力扣题解&#xff1a;. - 力扣&#x…

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

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

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

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

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

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

PaaS家族的中坚力量——aPaaS

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

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

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

AI在编程中的作用:提升效率、改善代码质量与未来发展趋势

引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已逐渐渗透到我们生活的方方面面&#xff0c;而在编程领域&#xff0c;AI的应用正带来革命性的变革。从代码生成到错误检测&#xff0c;再到自动化测试&#xff0c;AI的身影无处不在。本文将深入探讨AI…

前端 网络相关事件 交互

前端 网络相关事件 交互 设置断线、上线提示 这里可以做断线重连 使用online表示在线事件使用offline表示离线事件 当前是否离线 /*** * 判断是否离线* 如果是在线将值改为在线*/ window.addEventListener("offline", function (event) {onlineStatus.innerHTML…

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

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

Java面试题合集-史上最全

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

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),…