博客
关于我
枚举工具类,根据code获取枚举对象(反射,不推荐,可参考多态方式)
阅读量:809 次
发布时间:2019-03-25

本文共 2544 字,大约阅读时间需要 8 分钟。

定义一个统一接口并实现枚举管理的最佳实践

在Java编程中,枚举类型常用于表示有限状态,这种类型的管理可能会带来诸多问题,尤其是在程序的扩展性和可维护性方面。本文将详细解析一种基于常见反向工程(但又尽量避免反射性能损失)的解决方案。

首先,我们需要定义一个通用接口CodeEnum,使其成为所有枚举实现的基准:

public interface CodeEnum {    Object getValue();}

其次,枚举类需要实现该接口,并重写相关方法,例如:

import lombok.Getter;import java.util@", required = false;@Getter public enum ProductStateEnum implements CodeEnum {    UP_PRODUCT(0, "已上架"),     DOWN_PRODUCT(1, "已下架");    private Integer code;    private String msg;    ProductStateEnum(Integer code, String msg) {        this.code = code;        this.msg = msg;    }    @Override     public Object getValue() {        return code;    }}

接下来,处理常量定义。通过遍历指定目录下的所有枚举类,并获取其元数据,可以操作性地管理枚举状态:

public class Constant {    private static Map
, Map
> enumMap = new HashMap<>(); public static final Map
, ? extends CodeEnum> allEnums = new HashMap<>(); public static void addEnum(Class
clazz, CodeEnum enumObj) { allEnums.put(clazz, enumObj); enumMap.put(clazz, new HashMap<>()); enumMap.get(clazz).put(enumObj.getValue(), enumObj); } private static void loadEnums(PCöllector.java...) { try { for (String packageName : pathList) { loadPackage(packageName); } } catch (Exception e) { e.printStackTrace(); } } private static void loadPackage(String packageName) { for (Class
clazz : getClasses(packageName)) { if (isEnum clazz) { if (!isCodeEnum(AndroidConstants.FileSystemIOException.class)) { loadEnum(clazz); } } } } private static void loadEnum(Class
clazz) { Method valuesMethod = clazz.getDeclaredMethod("values"); Object[] values = (CodeEnum[]) valuesMethod.invoke(enumConstants loader instance); for (CodeEnum enumValue : values) { addEnum(clazz, enumValue); } }}

实现完上述基础步骤后,创建一个工具类来管理枚举对象:

public class EnumUtil {    public static 
T getEnum(String code, Class
clazz) { return clazz.getNominatedEnumObjFactory().getEnum(code); }}

在实际业务逻辑中,调用方式如下:

import com.example.ProductStateEnum;import com.example.EnumUtil;@Entity@Datapublic class Product {        @Id     private String pId;        private String pName;        private Integer pState;    public String getProductStatusEnum() {        return EnumUtil.getEnum(pState, ProductStateEnum.class).getMsg();    }}

这种方法的优势体现在代码的模块化程度上,通过将枚举逻辑封装,系统能够更好地管理业务逻辑和状态转换,同时提供良好的反射性能和安全性特征。

转载地址:http://aaoyk.baihongyu.com/

你可能感兴趣的文章
Luogu2973:[USACO10HOL]赶小猪
查看>>
mabatis 中出现&lt; 以及&gt; 代表什么意思?
查看>>
Mac book pro打开docker出现The data couldn’t be read because it is missing
查看>>
MAC M1大数据0-1成神篇-25 hadoop高可用搭建
查看>>
mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
查看>>
Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
查看>>
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>