Java 通过枚举类减少if else
目录
- 一. 案例1
- 二. 案例2
- 三. 案例3
- 四. 案例4 枚举类聚合封装消息
一. 案例1
涉及到EnumMap的实际使用
⏹定义一个枚举类,用来表示日本的各种支付方法对应的code
import com.fasterxml.jackson.annotation.JsonFormat;// 让jackson将前台的数据封装数据到枚举类中
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum PayEnum {RAKUTEN_PAY("1"),PAY_PAY("2"),ID_PAY("3");private String code;PayEnum(String code) {this.code = code;}public String getCode() {return code;}
}
⏹用来接收前台的数据的form实体类
import lombok.Data;@Data
public class PayForm {// 自定义的枚举类private PayEnum payMethod;private String msg;
}
⏹支付接口以及其实现类
// 支付接口
public interface IPay {void pay();
}// ID支付
public class IdPay implements IPay {@Overridepublic void pay() {System.out.println("ID支付...");}
}// paypay支付
public class PayPay implements IPay {@Overridepublic void pay() {System.out.println("paypay支付...");}
}// 乐天支付
public class RakuTenPay implements IPay {@Overridepublic void pay() {System.out.println("乐天pay支付...");}
}
⏹后台的实际应用
- EnumMap的key是枚举类
- 通过EnumMap将枚举类与枚举类对应的支付接口进行聚合
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import java.util.EnumMap;@Controller
@RequestMapping("/test35")
public class Test35Controller {// 使用EnumMap对枚举类和枚举类对应的支付方式进行映射聚合private static final EnumMap<PayEnum, IPay> commandMap = new EnumMap<PayEnum, IPay>(PayEnum.class){{put(PayEnum.ID_PAY, new IdPay());put(PayEnum.PAY_PAY, new PayPay());put(PayEnum.RAKUTEN_PAY, new RakuTenPay());}};@GetMapping("/init")public ModelAndView init() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("test35");return modelAndView;}@PostMapping("/pay")public ResponseEntity<Void> pay(@RequestBody PayForm payForm) {System.out.println(payForm);// 判断支付方式是否存在if (!commandMap.containsKey(payForm.getPayMethod())) {System.out.println("支付方式不存在......");return ResponseEntity.noContent().build();}// 支付方式存在的话,调用支付接口进行支付IPay payMethod = commandMap.get(payForm.getPayMethod());payMethod.pay();return ResponseEntity.noContent().build();}
}
⏹前台
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><button id="btn">发送请求</button>
</body>
<script type="text/javascript" th:src="@{/js/public/jquery-3.6.0.min.js}"></script>
<script>$(function() {bindEvent();});function bindEvent() {$("#btn").click(() => {const jsonData = {msg: "110120119",// 代表paypay支付payMethod: "2"};$.ajax({url: `/test35/pay`,type: 'POST',data: JSON.stringify(jsonData),contentType: 'application/json;charset=utf-8',success: function (data, status, xhr) {console.log(data);}});});}
</script>
</html>
⏹效果

二. 案例2
⏹定义一个接口
public interface RoleOperation {// 表示某个角色可以做哪些op操作String op();
}
⏹定义一个枚举类实现接口
// 定義一個枚舉類實現接口
public enum RoleEnum implements RoleOperation {// 系统管理员(有A操作权限)ROLE_ROOT_ADMIN {@Overridepublic String op() {return "ROLE_ROOT_ADMIN:" + " has AAA permission";}},// 订单管理员(有B操作权限)ROLE_ORDER_ADMIN {@Overridepublic String op() {return "ROLE_ORDER_ADMIN:" + " has BBB permission";}},// 普通用户(有C操作权限)ROLE_NORMAL {@Overridepublic String op() {return "ROLE_NORMAL:" + " has CCC permission";}};}
⏹调用
// 角色的名称
String role = "ROLE_ROOT_ADMIN";// 将枚举类中所有的角色都放到List中
List<RoleEnum> roleEnums = Arrays.asList(RoleEnum.values());
// 判断List中是否有相应的角色
if (roleEnums.contains(role)) {// 如果有的话,就执行该角色所对应的方法RoleEnum roleEnum = RoleEnum.valueOf(role);System.out.println(roleEnum.op());
} else {System.out.println("對應的角色不存在");
}
三. 案例3
public enum MessageEnum {SUCCESS(1, "成功"),FAIL(-1, "失败"),TIME_OUT(-2, "网络超时"),PARAM_ERROR(-3, "参数错误");private int code;private String message;MessageEnum(int code, String message) {this.code = code;this.message = message;}public int getCode() {return this.code;}public String getMessage() {return this.message;}// 根据code获取对应的value.如果没有对应的code,就返回一个nullpublic static MessageEnum getMessageEnum(int code) {return Arrays.stream(MessageEnum.values()).filter(x -> x.code == code).findFirst().orElse(null);}
}
⏹调用
Optional<MessageEnum> messageEnum = Optional.ofNullable(MessageEnum.getMessageEnum(10));
if (messageEnum.isPresent()) {System.out.println(messageEnum.get().getMessage());
} else {System.out.println("對應的code不存在");
}
四. 案例4 枚举类聚合封装消息
import java.util.HashMap;
import java.util.Map;public final class AngConst {// 用于枚举类实现的接口public interface IAngConst {}// 枚举类实现接口public enum AngAliPay implements IAngConst {LOG_001,LOG_002,LOG_003}public enum AngPayPay implements IAngConst {LOG_001,LOG_002,LOG_003}public enum AngIDPay implements IAngConst {LOG_001,LOG_002,LOG_003}// 枚举类实现接口的妙处在此处体现// 或者可以使用EnumMap来进行聚合public static Map<IAngConst, String> dataMap = new HashMap<>(){{// 支付方式—AngAliPayput(AngAliPay.LOG_001, "AngAliPay处理开始...");put(AngAliPay.LOG_002, "AngAliPay处理被中断...");put(AngAliPay.LOG_003, "AngAliPay处理结束...");// 支付方式—AngPayPayput(AngPayPay.LOG_001, "AngPayPay处理开始...");put(AngPayPay.LOG_002, "AngPayPay处理被中断...");put(AngPayPay.LOG_003, "AngPayPay处理结束...");// 支付方式—AngIDPayput(AngIDPay.LOG_001, "AngIDPay处理开始...");put(AngIDPay.LOG_002, "AngIDPay处理被中断...");put(AngIDPay.LOG_003, "AngIDPay处理结束...");}};
}相关文章:
Java 通过枚举类减少if else
目录 一. 案例1二. 案例2三. 案例3四. 案例4 枚举类聚合封装消息 一. 案例1 涉及到EnumMap的实际使用 ⏹定义一个枚举类,用来表示日本的各种支付方法对应的code import com.fasterxml.jackson.annotation.JsonFormat;// 让jackson将前台的数据封装数据到枚举类中 J…...
单链表---移除链表元素
对于无头单向不循环链表,给出头结点head与数值val,删除链表中数据值val的所有结点 #define ListNodeDataType val struct ListNode { struct ListNode* psll;ListNodeDataType val; } 方法一---遍历删除 移除所有数值为val的链表结点,…...
认识redis 及 Ubuntu安装redis
文章目录 一. redis概念二. redis应用场景二. redis的特性四. 使用Ubuntu安装redis 一. redis概念 redis 是在内存中存储数据的中间件, 用在分布式系统 redis是客户端服务器结构的程序, 客户端服务器之间通过网络来通信 二. redis应用场景 redis可用作数据库 类似MySQL, 但…...
Java开发网络安全常见问题
1、敏感信息明文传输 用户敏感信息如手机号、银行卡号、验证码等涉及个人隐私的敏感信息不通过任何加密直接明文传输。 如下图中小红书APP 的手机短信验证码登录接口,此处没有对用户手机号和验证码等信息进行加密传输,可以很简单的截取并开展一些合法的…...
C#基础之委托,事件
文章目录 1 委托1.1 简介1.2 操作使用1.2.1 声明委托(Delegate)1.2.2 实例化委托(Delegate)1.2.3 直接调用和invoke1.2.4 Invoke 和 BeginInvoke 1.3 委托的多播1.4 委托的匿名和lambda1.4.1 匿名方法1.4.2 lambda 表达式 1.5 内置…...
nginx配置静态资源的访问
比如静态资源图片位于/mnt/software/nginx/html/static/images目录下,那么nginx.conf中的配置则为: # 静态文件目录 location /static/images/ { root /mnt/software/nginx/html; try_files $uri $uri/ 404; #找不到时提示404 …...
JS的魔法三角:constructor、prototype与__proto__
在JavaScript中,constructor、prototype和__proto__是与对象创建和继承机制紧密相关的三个概念。理解它们之间的关系对于掌握JavaScript的面向对象编程至关重要。下面将详细介绍这个魔法三角: 1. constructor 定义:constructor是一个函数&am…...
CA系统(file.h---申请认证的处理)
#pragma once #ifndef FILEMANAGER_H #define FILEMANAGER_H #include <string> namespace F_ile {// 读取文件,返回文件内容bool readFilename(const std::string& filePath);bool readFilePubilcpath(const std::string& filePath);bool getNameFro…...
matlab显示sin二维图
1,新建脚本 2、保存脚本 3、脚本命令:clc 清除 脚本命令的信息 clrear all 清除全部 4工作区内容:变量啥的 x0:0.001:2*pi%% 开始 精度 中值 ysin(x) y1cos(x) figure%%产生一个屏幕 plot(x,y)%%打印坐标 title(ysin(x))%%标题 xlabel(…...
验证 kubelet 服务已经停止并且不再生成错误日志
要验证 kubelet 服务已经停止并且不再生成错误日志,可以按照以下步骤进行操作: 1. 检查 kubelet 服务状态 首先,确认 kubelet 服务已经停止。 Bash 深色版本 sudo systemctl status kubelet 你应该看到类似以下的输出,表示服…...
【Linux】进程控制-----进程替换
目录 一、为什么要进行进程替换: 二、进程替换的原理: 三、exec家族: 1、execl: 2、execlp: 3、execv: 4、execvp: 5、execle和execve 编辑 putenv: 一、为什么要进行进程…...
安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本
安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本。 原因是:当前操作系统版本为Windows Server 2016 Standard版本,其自带的Microsoft .NET Framework 版本为4.6太低,不满足要求。 根据报错的提示,点击链接…...
使用ECharts创建带百分比标注的环形图
在数据可视化领域,环形图是一种非常有效的图表类型,它能够清晰地展示各部分与整体的关系。今天,我们将通过ECharts来创建一个带百分比标注的环形图,并详细解释如何实现这一效果。 1. 数据准备 首先,我们定义了一些基础…...
学习threejs,设置envMap环境贴图创建反光效果
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.CubeTextureLoader 立…...
go语言里的mkdir mkdirall有什么区别?
在Go语言中,os.Mkdir 和 os.MkdirAll 都是用来创建目录的函数,但它们之间存在一些关键的区别。 ### os.Mkdir - **功能**:os.Mkdir 用于创建一个单一的目录。如果该目录已经存在,则会返回一个错误。 - **参数**: - na…...
使用Python OpenCV实现图像形状检测
目录 一、环境准备 二、读取和预处理图像 读取图像 灰度化 滤波去噪 三、边缘检测 四、查找轮廓 五、绘制轮廓 六、形状分类 七、显示结果 八、完整代码示例 九、总结 图像形状检测是计算机视觉领域中的一项关键技术,广泛应用于工业自动化、机器人视觉、医学图像处…...
继上一篇,设置弹框次数以及自适应图片弹框,部分机型(vivo)老手机不显示的问题
上一篇写的本来测试好多型号都无事, 今天下午公司的战斗机vivo横空冒出… 晕 弹框直接显示都出不来了,现在还有用这种老的机型的,但是没办法咯~ 前端遇到这种兼容性的问题就要勇于解决 主要解决了这几点: // 添加图片加载事件 <imgv-if"imageUrl":src"image…...
基于RISC-V 的代理内核实验(使用ub虚拟机安装基本环境)
1.安装支撑软件 第一步,安装依赖库 RISC-V交叉编译器的执行仍然需要一些本地支撑软件包,可使用以下命令安装: $ sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bis…...
【MMKV】HarmonyOS中的优秀轻量化存储方式
MMKV 引言 在移动应用开发的世界里,数据存储和管理是至关重要的一环。随着技术的不断进步,开发者们对于高性能、轻量级、易用的数据存储解决方案的需求日益增长。MMKV(Memory Mapped Key-Value)正是这样一个开源的高性能key-val…...
docker安装hadoop环境
一、使用docker搭建基础镜像 1、拉取centos系统镜像 # 我这里使用centos7为例子 docker pull centos:7 2、创建一个dockerfiler文件,用来构建自定义一个有ssh功能的centos镜像 # 基础镜像 FROM centos:7 # 作者 #MAINTAINER hadoop ADD Centos-7.repo /etc/yum.re…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
