博客
关于我
枚举工具类,根据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/

你可能感兴趣的文章
mysql 写入慢优化
查看>>
mysql 分组统计SQL语句
查看>>
Mysql 分页
查看>>
Mysql 分页语句 Limit原理
查看>>
MySql 创建函数 Error Code : 1418
查看>>
MySQL 创建新用户及授予权限的完整流程
查看>>
mysql 创建表,不能包含关键字values 以及 表id自增问题
查看>>
mysql 删除日志文件详解
查看>>
mysql 判断表字段是否存在,然后修改
查看>>
MySQL 到底能不能放到 Docker 里跑?
查看>>
mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
查看>>
MySQL 加锁处理分析
查看>>
mysql 协议的退出命令包及解析
查看>>
mysql 参数 innodb_flush_log_at_trx_commit
查看>>
mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
查看>>
MySQL 命令和内置函数
查看>>
mysql 四种存储引擎
查看>>
MySQL 在并发场景下的问题及解决思路
查看>>
MySQL 基础架构
查看>>
MySQL 基础模块的面试题总结
查看>>