Java根据code获取枚举优化

news2024/9/22 3:59:53

Java枚举获取优化

  • 需求
  • 原始解决方案
  • 优化方案
    • 1. 首先创建base接口。
    • 2. 创建枚举工具类
    • 3. 需要使用工具类的枚举,实现BaseEnum接口即可
    • 4. 测试使用
  • 拓展

需求

自己模拟两个枚举,假设业务中需要用到

Example1StatusEnum.java

package com.zdh.zdhenum;

/**
 * @author dh
 * @date 2024/07/24
 * @desc (详细信息)
 */
public enum Example1StatusEnum {
    NEW("new", "新建状态"),
    FAIL("fail", "失败状态"),
    SUCCESS("success", "成功状态"),
    CLOSED("closed", "关闭状态");

    private String code;

    private String description;

    Example1StatusEnum(String code, String description) {
        this.code = code;
        this.description = description;
    }
}

Example2StatusEnum .java

package com.zdh.zdhenum;

import com.fasterxml.jackson.databind.ser.Serializers;

/**
 * @author dh
 * @date 2024/07/24
 * @desc (详细信息)
 */
public enum Example2StatusEnum implements BaseEnum {
    NEW("new", "新建状态"),
    FAIL("fail", "失败状态"),
    SUCCESS("success", "成功状态"),
    PROCESSING("processing", "处理中状态"),
    WAITING("waiting", "等待状态"),
    CLOSED("closed", "关闭状态"),
    ABANDONED("abandoned", "弃状态");

    private String code;

    private String description;

    Example2StatusEnum(String code, String description) {
        this.code = code;
        this.description = description;
    }

}

实际场景中,可能远远大于2个,每个枚举类内item有唯一的code,实际业务开发中需要根据唯一的code获取对应的枚举类型。

原始解决方案

哪个枚举类需要根据code获取对应的枚举,就在该枚举类中添加获取方法

例如Example1StatusEnum 需要根据code获取对应的枚举,在Example1StatusEnum 添加如下方法:

public static Example1StatusEnum  toEnum(String code){
        for (Example1StatusEnum item : Example1StatusEnum.values()) {
            if (Objects.equals(item.getCode(),code)) {
                return item;
            }
        }
        return null;
    }

同理,其他需要用到此方法,都需要复制上面的方法,并更改为对应类型,大量重复性工作。

优化方案

1. 首先创建base接口。

package com.zdh.zdhenum;

/**
 * @author dh
 * @date 2024/07/23
 * @desc (详细信息)
 */
public interface BaseEnum {
    /**
     * 获取code
     * @return
     */
    String getCode();
}

后面工具类根据此接口方法可以 通用的获取code

2. 创建枚举工具类

package com.zdh.zdhenum;

import java.util.Objects;

/**
 * @author dh
 * @date 2024/07/24
 * @desc (详细信息)
 */
public class MyEnumUtil {

    public static <E extends Enum<E> & BaseEnum> E toEnumByCode(String code, Class<E> enumClass) {
        for (E enumConstant : enumClass.getEnumConstants()) {
            if (Objects.equals(enumConstant.getCode(),code)) {
                return enumConstant;
            }
        }
        return null;
    }
}

<E extends Enum<E> & BaseEnum> 这里泛型,extends 表现必须继承自后面的xxx,BaseEnum规定必须实现上面定义的BaseEnum接口,Enum<E> 为枚举类的公共父类,规定必须是枚举类可以用此方法。

3. 需要使用工具类的枚举,实现BaseEnum接口即可

例如,Example1StatusEnumExample2StatusEnum都需要使用。

分别修改如下:

package com.zdh.zdhenum;

import java.util.Objects;

/**
 * @author dh
 * @date 2024/07/24
 * @desc (详细信息)
 */
public enum Example1StatusEnum implements BaseEnum{
    NEW("new", "新建状态"),
    FAIL("fail", "失败状态"),
    SUCCESS("success", "成功状态"),
    CLOSED("closed", "关闭状态");

    private String code;

    private String description;

    Example1StatusEnum(String code, String description) {
        this.code = code;
        this.description = description;
    }

    /**
     * 获取code
     *
     * @return
     */
    @Override
    public String getCode() {
        return this.code;
    }

}

package com.zdh.zdhenum;

import com.fasterxml.jackson.databind.ser.Serializers;

/**
 * @author dh
 * @date 2024/07/24
 * @desc (详细信息)
 */
public enum Example2StatusEnum implements BaseEnum {
    NEW("new", "新建状态"),
    FAIL("fail", "失败状态"),
    SUCCESS("success", "成功状态"),
    PROCESSING("processing", "处理中状态"),
    WAITING("waiting", "等待状态"),
    CLOSED("closed", "关闭状态"),
    ABANDONED("abandoned", "弃状态");

    private String code;

    private String description;

    Example2StatusEnum(String code, String description) {
        this.code = code;
        this.description = description;
    }

    /**
     * 获取code
     *
     * @return
     */
    @Override
    public String getCode() {
        return this.code;
    }
}

4. 测试使用

    public static void main(String[] args) {
        Example1StatusEnum quotaStatusEnum11 = MyEnumUtil.toEnumByCode("new", Example1StatusEnum.class);
        System.out.println("quotaStatusEnum11 = " + quotaStatusEnum11);
        Example1StatusEnum quotaStatusEnum12 = MyEnumUtil.toEnumByCode("fda", Example1StatusEnum.class);
        System.out.println("quotaStatusEnum12 = " + quotaStatusEnum12);

        Example2StatusEnum quotaStatusEnum21 = MyEnumUtil.toEnumByCode("new", Example2StatusEnum.class);
        System.out.println("quotaStatusEnum11 = " + quotaStatusEnum21);
        Example2StatusEnum quotaStatusEnum22 = MyEnumUtil.toEnumByCode("fda", Example2StatusEnum.class);
        System.out.println("quotaStatusEnum12 = " + quotaStatusEnum22);
    }

为了方便查看效果,可以在最后打个断点。
在这里插入图片描述

查看结果,发现和预期一样

在这里插入图片描述

拓展

假设,可能需要根据description 获取枚举,实际场景可能遇不到,重点在于思想。

那么几种解决方案:

  1. 原有的BaseEnum接口上加一个String getDescription(),然后MyEnumUtil 中添加一个和toEnumByCode类似的方法,泛型中依然使用BaseEnum。
  2. 新建一个接口BaseDescEnum,里面就一个String getDescription()方法。然后MyEnumUtil 中添加一个和toEnumByCode类似的方法,泛型中使用新的BaseDescEnum。

这里我建议使用第2种方法,这样颗粒度更细。第1种就算不需要根据description 获取枚举,也要实现String getDescription方法(虽然1.8之后可以通default关键字在接口默认实现,但是个人不太建议此场景这么使用)。

下面简单说一下实现。
新增BaseDescEnum接口

package com.zdh.zdhenum;

/**
 * @author dh
 * @date 2024/07/23
 * @desc (详细信息)
 */
public interface BaseDescEnum {
    /**
     * 获取description
     * @return
     */
    String getDescription();
}

假设仅仅Example1StatusEnum需要,代码修改如下:

package com.zdh.zdhenum;

import java.util.Objects;

/**
 * @author developer_ZhangXinHua
 * @date 2024/07/24
 * @desc (详细信息)
 */
public enum Example1StatusEnum implements BaseEnum,BaseDescEnum{
    NEW("new", "新建状态"),
    FAIL("fail", "失败状态"),
    SUCCESS("success", "成功状态"),
    CLOSED("closed", "关闭状态");

    private String code;

    private String description;

    Example1StatusEnum(String code, String description) {
        this.code = code;
        this.description = description;
    }

    /**
     * 获取code
     *
     * @return
     */
    @Override
    public String getCode() {
        return this.code;
    }


    /**
     * 获取description
     *
     * @return
     */
    @Override
    public String getDescription() {
        return this.description;
    }
}

MyEnumUtil中添加如下方法

  public static <E extends Enum<E> & BaseDescEnum> E toEnumByDesc(String desc, Class<E> enumClass) {
        for (E enumConstant : enumClass.getEnumConstants()) {
            if (Objects.equals(enumConstant.getDescription(),code)) {
                return enumConstant;
            }
        }
        return null;
    }

调用

public static void main(String[] args) {
        Example1StatusEnum quotaStatusEnum11 = MyEnumUtil.toEnumByCode("new", Example1StatusEnum.class);
        System.out.println("quotaStatusEnum11 = " + quotaStatusEnum11);
        Example1StatusEnum quotaStatusEnum12 = MyEnumUtil.toEnumByCode("processing", Example1StatusEnum.class);
        System.out.println("quotaStatusEnum12 = " + quotaStatusEnum12);

        Example2StatusEnum quotaStatusEnum21 = MyEnumUtil.toEnumByCode("processing", Example2StatusEnum.class);
        System.out.println("quotaStatusEnum11 = " + quotaStatusEnum21);
        Example2StatusEnum quotaStatusEnum22 = MyEnumUtil.toEnumByCode("fda", Example2StatusEnum.class);
        System.out.println("quotaStatusEnum12 = " + quotaStatusEnum22);

        Example1StatusEnum enumByDesc11 = MyEnumUtil.toEnumByDesc("新建状态", Example1StatusEnum.class);
        System.out.println("enumByDesc11 = " + enumByDesc11);
        Example1StatusEnum enumByDesc12 = MyEnumUtil.toEnumByDesc("xfdas", Example1StatusEnum.class);
        System.out.println("enumByDesc12 = " + enumByDesc12);
//        Example1StatusEnum enumByDesc13 = MyEnumUtil.toEnumByDesc("新建状态", Example2StatusEnum.class);
//        System.out.println("enumByDesc13 = " + enumByDesc13);
    }

发现如果Example2StatusEnum没有实现BaseDescEnum,连编译都不能通过。为什么上文不建议使用default,这样如果别人不熟悉实现,使用我们的工具类,可以强制让使用该工具类的人员,必须通过BaseDescEnum实现进行重写getDescription,防止忘记重写getDescription,从而获取到错误的description。
在这里插入图片描述
正常获取。
在这里插入图片描述
至此,优化完成。🎉🎊

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

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

相关文章

【大师与bug里特】M_Studio《王国之梦》学习笔记

1️⃣ Object & object(✅) 之辨 《7.泛型事件框架〈余2min左右时〉》 不然inspector窗口的最后一行&#xff08;告诉我们订阅者是SceneLoadManager它身上挂了☝️ObjectEventListener用来监听这个事件 有多少个事件注册到这里来了都能够看到&#xff09;还是不会出现 加上…

光谱分析仪进行一些常规参数测量的方法有哪些?

光谱分析仪在光纤通信产品中的应用&#xff0c;以AQ6370光谱分析仪为例&#xff0c;详细说明了使用光谱分析仪进行一些常规参数测量的方法。这些参数包括光谱的带宽、边模抑制比、增益、噪声系数和系统OSNR等。文章中还提到了光谱分析仪的一些基本功能&#xff0c;如屏幕显示测…

人大金仓亮相国际金融展,助力数字金融跑出“加速度”

7月19日至21日&#xff0c;由商务部批准、中国金融电子化集团有限公司主办的2024中国国际金融展&#xff08;以下简称“金融展”&#xff09;在北京国家会议中心举办。作为数据库领域国家队&#xff0c;人大金仓携金融领域创新成果与解决方案亮相本次金融展&#xff0c;获得了业…

ChatTTS真人文本转语音模型,富有韵律与情感,且免费开源

上期图文教程&#xff0c;我们分享了微软TTS真人转语音大模型&#xff0c;但是微软的TTS模型只有针对新用户免费一年&#xff0c;其他用户都是收费的&#xff0c;虽然微软开源了部分TTS的功能&#xff0c;但是针对真人类似的富有情感的TTS模型并没有进行开源&#xff0c;本期介…

代码随想录day21 二叉树最后一天 || 669修剪二叉树 108将有序数组转变为平衡搜索二叉树 538把搜索二叉树变为累加二叉树

669修剪二叉树 力扣题目链接 题目描述&#xff1a; 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果…

Anything LLM ,构建自己的 RAG 架构 LLM,学习自己的知识库

本心、输入输出、结果 文章目录 Anything LLM ,构建自己的 RAG 架构 LLM,学习自己的知识库前言什么是Anything LLM?主要功能与技术原理功能亮点技术原理安装与使用方法初始设置模型部署案例应用企业知识管理个性化教育助手内容创作助手Anything LLM 开源新Anything LLM ,构…

DolphinDB Web 端权限管理:可视化操作指南

在现代数据库管理中&#xff0c;高效和直观的权限管理对于用户的数据安全是至关重要的。过去 DolphinDB 用户需要依赖系统脚本来管理用户和权限&#xff0c;这对于缺乏技术背景的管理员来说既复杂又容易出错。 为了提升用户体验和操作效率&#xff0c;DolphinDB 目前在 Web 上…

解决nvm use无效问题

首先安装先确定没错。nvm安装教程 问题&#xff1a;nvm use 后 node和npm均无法使用&#xff0c;nvm list也没有*号 原因&#xff1a;nvm目录下没有nodejs文件夹 解决办法&#xff1a;先nvm install 一个版本&#xff0c;复制&#xff0c;改名nodejs&#xff0c;比如我这里是复…

unity2D游戏开发02添加组件移动玩家

添加组件 给PlayGame和EnemyObject添加组件BoxCollider 2D碰撞器&#xff0c;不用修改参数 给PlayGame添加组件Rigibody 2D 设置数据 添加EnemyObject&#xff0c;属性如下 Edit->project setting->Physics 2D 将 y的值改为0 给playerObject添加标签 新建层 将PlayerObj…

MacOS安装SDKMan管理Java版本

文章目录 1 简介2 安装与卸载2.1 安装2.2 卸载 3 使用3.1 查看其他工具&#xff1a;支持 Ant, Maven 等3.2 查看Java版本3.3 安装Java&#xff0c;加上相关的版本3.4 设置Java版本(全局)3.5 只在当前窗口生效3.6 卸载1 默认环境无法卸载 4 jdk安装的位置5 与IDEA集成参考 1 简介…

【目标检测实验系列】EMA高效注意力机制,融合多尺度特征,助力YOLOv5检测模型涨点(文内附源码)

1. 文章主要内容 本篇博客主要涉及多尺度高效注意力机制&#xff0c;融合到YOLOv5s模型中&#xff0c;增加模型提取多尺度特征的能力&#xff0c;助力模型涨点。&#xff08;通读本篇博客需要7分钟左右的时间&#xff09;。 2. 简要概括 论文地址&#xff1a;EMA论文地址 如下…

使用 VMware vCenter Server(vSphere Client)迁移 ESXi 虚拟机

我需要将虚拟机 k8s-dev-node4从 ESXi 主机 192.168.1.161 迁移到 ESXi 主机 192.168.1.162 上&#xff0c;使用 VMware vCenter Server&#xff08;vSphere Client&#xff09;在浏览器上可视化操作&#xff0c;将这个需求变的非常简单。 1、选中需要迁移的虚拟机&#xff0c…

k8s部署rabbitmq集群

1 部署集群 1.1 安装 # 创建一个中间件的命名空间 kubectl create namespace middleware # 创建ConfigMap,包含RabbitMQ的配置文件内容 kubectl apply -f rabbitmq-configmap.yaml # 配置用于存储RabbitMQ数据的PersistentVolume&#xff08;PV&#xff09;和PersistentVolum…

系统架构设计师教程 第4章 信息安全技术基础知识-4.3 信息安全系统的组成框架4.4 信息加解密技术-解读

系统架构设计师教程 第4章 信息安全技术基础知识-4.3 信息安全系统的组成框架 4.3 信息安全系统的组成框架4.3.1 技术体系4.3.1.1 基础安全设备4.3.1.2 计算机网络安全4.3.1.3 操作系统安全4.3.1.4 数据库安全4.3.1.5 终端安全设备4.3.2 组织机构体系4.3.3 管理体系4.4 信息加…

机器学习(五) -- 无监督学习(1) --聚类2

系列文章目录及链接 上篇&#xff1a;机器学习&#xff08;五&#xff09; -- 无监督学习&#xff08;1&#xff09; --聚类1 下篇&#xff1a; 前言 tips&#xff1a;标题前有“***”的内容为补充内容&#xff0c;是给好奇心重的宝宝看的&#xff0c;可自行跳过。文章内容被…

微服务(网关路由)

目录 一&#xff1a;网关路由 1&#xff1a;认识网关 2&#xff1a;快速入门 2.1&#xff1a;创建项目 2.2&#xff1a;引入依赖 2.3&#xff1a;启动类 2.4&#xff1a;路由配置 2.5&#xff1a;测试 3&#xff1a;路由过滤 二&#xff1a;网关登录校验 1&…

OpenWrt 为软件包和docker空间扩容

参考资料 【openwrt折腾日记】解决openwrt固件刷入后磁盘空间默认小的问题&#xff0c;关联openwrt磁盘扩容空间扩容【openwrt分区扩容】轻松解决空间可用不足的尴尬丨老李一瓶奶油的YouTube 划分空间 参考一瓶奶油的YouTube 系统 -> 磁盘管理 -> 磁盘 -> 修改 格…

探索Linux-1

Linux是什么&#xff1f; Linux是一个开源的操作系统内核&#xff0c;由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于1991年首次发布。它基于Unix操作系统&#xff0c;但提供了更多的自由和灵活性。Linux内核是操作系统的核心部分&#xff0c;负责管理系统资源、处理…

编程中的智慧四:设计模式总览

前面三篇我们通过从一些零散的例子&#xff0c;和简单应用来模糊的感受了下设计模式在编程中的智慧&#xff0c;从现在开始正式进入设计模式介绍&#xff0c;本篇将从设计模式的7大原则、设计模式的三大类型、与23种设计模式的进行总结&#xff0c;和描述具体意义。 设计模式体…

LeetCode 860柠檬水找零(贪心算法)/406根据身高重建队列(贪心算法)

1. 柠檬水找零 思路分析 只需要维护三种金额的数量&#xff0c;5&#xff0c;10和20。 有如下三种情况&#xff1a; 情况一&#xff1a;账单是5&#xff0c;直接收下。情况二&#xff1a;账单是10&#xff0c;消耗一个5&#xff0c;增加一个10情况三&#xff1a;账单是20&am…