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://xiahunao.cn/news/2868553.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 中 MySQL 的部署与管理

目录 一、Docker 中部署 MySQL1.1 部署 MySQL1.2 进入容器并创建数据库1.3 Navicat 可视化工具连接 二、可能存在的问题2.1 1130 - Host ‘172.17.0.1‘ is not allowed to connect to this MySQL server 参考资料 一、Docker 中部署 MySQL 1.1 部署 MySQL 首先,从…

因时夹爪urdf文件改写为xacro并搭配aubo_i5机械臂

因时夹爪urdf文件改写为xacro并搭配aubo_i5机械臂 一、因时夹爪内容二、改写为xacro模式三、aubo i5搭配因时夹爪 一、因时夹爪内容 因时夹爪型号&#xff1a;EG2-4C 夹爪的urdf文件内容&#xff1a; <robotname"jawasm1"><linkname"base_link"…

计算机网络 |内网穿透

其实内网穿透&#xff0c;也挺好玩的&#xff0c;如果在大学的时候&#xff0c;那个时候讲计算机网络的老师能横向延展&#xff0c;估计课也会更有趣不少&#xff0c;本来计算机网络这门课就是计算机课程中可玩性最搞的。 只能说&#xff0c;怪可惜的 回到正题&#xff0c;内网…

三菱FX5U可编程控制器应用指令精讲

三菱FX5U可编程控制器是三菱公司力推的中小型控制器&#xff0c;是目前力推的iQ-F系列的明星产品。从编程的角度&#xff0c;它使用三菱GX-Works3软件&#xff0c;真正在写电气自动化程序的时候&#xff0c;有大量的指令需要我们去研究作用和用法&#xff0c;然后做试验写程序&…

【嵌入式实践】【芝麻】【硬件篇-4】从0到1给电动车添加指纹锁:IO电路简单介绍

0. 前言 该项目是基于stm32F103和指纹模块做了一个通过指纹锁控制电动车的小工具。支持添加指纹、删除指纹&#xff0c;电动车进入P档等待时计时&#xff0c;计时超过5min则自动锁车&#xff0c;计时过程中按刹车可中断P档状态&#xff0c;同时中断锁车计时。改项目我称之为“芝…

【MySQL】5. 数据类型

数据类型 1. 数据类型分类 2. 数值类型 2.1 tinyint类型 数值越界测试&#xff1a; mysql> use tt; Database changed mysql> create table t1(-> num tinyint-> ); Query OK, 0 rows affected (0.01 sec)mysql> insert into t1 values(-128); Query OK, 1 r…

2024年【P气瓶充装】模拟考试及P气瓶充装证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 P气瓶充装模拟考试是安全生产模拟考试一点通生成的&#xff0c;P气瓶充装证模拟考试题库是根据P气瓶充装最新版教材汇编出P气瓶充装仿真模拟考试。2024年【P气瓶充装】模拟考试及P气瓶充装证考试 1、【多选题】《中华…

c语言按位与,按位或,按位异或,按位取反

1、按位与& 按位与的实现逻辑是相同为1&#xff0c;相异为0&#xff1b; 2、按位或 | 按位或的实现逻辑是有1为1&#xff0c;无一为0&#xff1b; 3、按位异或 ^ 按位或的实现逻辑是相同为0&#xff0c;相异为1&#xff1b; 4、按位取反 ~ 按位取反的实现逻辑是0改1&am…

想进阿里?先搞懂Spring Bean作用域!

大家好,我是小米!今天我来和大家分享一下 Java 开发中一项非常重要的技术——参数校验。参数校验在我们的代码中起着至关重要的作用,它能够确保我们的应用程序接收到正确的数据,并且保证了系统的安全性和稳定性。在过去,我们可能会通过繁琐的 if-else 来进行参数校验,但是…

Arduino IDE配置ESP8266开发环境

一、配置步骤 在Arduino IDE中配置ESP8266开发环境的详细步骤如下&#xff1a; 1.打开Arduino IDE&#xff0c;依次点击“文件”->“首选项”&#xff0c;在“附加开发板管理器网址”一栏添加ESP8266开发板的网址。常用的网址是&#xff1a; http://arduino.esp8266.com/s…

c语言:操作符详解(上)

目录 一、操作符的分类二、二进制和进制转换1.2进制转10进制2.10进制转2进制3.2进制转8进制4.2进制转16进制 三、原码、反码、补码四、算术操作符、-、*、/、%1.**和-**2.*3./4.% 五、移位操作符1.左移操作符2.右移操作符 六、位操作符&#xff1a;&、|、^、~七、赋值操作符…

软件测试工程师简历要怎么写,才能让HR看到

作为软件测试的从业者&#xff0c;面试或者被面试都是常有的事。 可是不管怎样&#xff0c;和简历有着理不清的关系&#xff0c;面试官要通过简历了解面试者的基本信息、过往经历等。 面试者希望通过简历把自己最好的一面体现给面试官&#xff0c;所以在这场博弈中&#xff0…

蓝桥杯练习系统(算法训练)ALGO-971 比较

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 给出一个n长的数列&#xff0c;再进行m次询问&#xff0c;每次询问询问两个区间[L1,R1]&#xff0c;[L2,R2]&#xff0c;  …

一款博客网站源码

一款博客网站源码 源码软件库 为大家内置了主题 清爽又强大真正的永久可用的一条源码&#xff0c;该版本为整合版本&#xff0c;内置了Joe主题&#xff0c;搭建后直接启用即可~ 安装环境要求&#xff1a; PHP 7.2 以上 MySQL, PostgreSQL, SQLite 任意一种数据库支持&#xff…

多种智能搜索算法可视化还原 3D 魔方

一、写在前面 许久没有写图形化界面的程序了&#xff0c;最近学习了一些经典的盲目搜索算法与智能搜索算法&#xff0c;正好拿来还原三阶魔方&#xff01;试试手&#xff01; 提前声明 我不是专业搞人工智能的&#xff0c;理论或者实现过程有些许错误也很正常&#xff0c;评论…

python的小技巧一

文章目录 python的小技巧系列1、变量相关变量交换三元运算符一个数值的范围比较有的场景下使用 try...exception 代替if...else 2、字符串相关格式化连接字符串的分割字符串的连接 3、生成器4、列表相关取最后一个元素判断列表是否为空列表合并去除列表中的重复值判断某个值是包…

HJXH-E1/U静态信号继电器 面板安装 辅助电源220VDC 启动电压220VDC JOSEF约瑟

HJXH系列静态信号继电器 HJXH-61/U静态信号继电器&#xff1b; HJXH-61/I静态信号继电器&#xff1b; HJXH-62/U静态信号继电器&#xff1b; HJXH-62/I静态信号继电器&#xff1b; HJXH-E1/U静态信号继电器&#xff1b; HJXH-E1/I静态信号继电器&#xff1b; HJXH-E2/U静态信号…

Vue的DOM根组件模版

<!DOCTYPE html> <html> <head><title>DOM根组件模版</title> </head> <body><div id"app" ><button click "count">{{ count }}</button></div><!-- 引入Vue.js --><script…

学python新手如何安装pycharm;python小白如何安装pycharm

首先找到官网&#xff1a; Download PyCharm: The Python IDE for data science and web development by JetBrains 打开后选择下载&#xff0c;下图标红部分 点击exe程序&#xff0c;点击下一步&#xff01; 选择安装路径&#xff0c;下一步 弹出界面全选 选择默认 然后直接…

ros、c++基于类的编程基础

基于class的编程结构&#xff0c;中间穿插ros的话题发布机制。 首先建立功能包&#xff1a; catkin_create_pkg control geometry_msgs message_generation message_runtime nav_msgs roscpp rospy std_msgs以上依赖基本上是大多数的ros消息所需要的依赖了。 然后确定我们的…