博客
关于我
枚举工具类,根据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 多表联合查询:UNION 和 JOIN 分析
查看>>
MySQL 大数据量快速插入方法和语句优化
查看>>
mysql 如何给SQL添加索引
查看>>
mysql 字段区分大小写
查看>>
mysql 字段合并问题(group_concat)
查看>>
mysql 字段类型类型
查看>>
MySQL 字符串截取函数,字段截取,字符串截取
查看>>
MySQL 存储引擎
查看>>
mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
查看>>
MySQL 存储过程参数:in、out、inout
查看>>
mysql 存储过程每隔一段时间执行一次
查看>>
mysql 存在update不存在insert
查看>>
Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
查看>>
Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
查看>>
Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
查看>>
Mysql 学习总结(89)—— Mysql 库表容量统计
查看>>
mysql 实现主从复制/主从同步
查看>>
mysql 审核_审核MySQL数据库上的登录
查看>>
mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
查看>>
mysql 导入导出大文件
查看>>