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

你可能感兴趣的文章
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>
MySQL DBA 进阶知识详解
查看>>
Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)
查看>>
Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
查看>>
mysql deadlock found when trying to get lock暴力解决
查看>>
MuseTalk如何生成高质量视频(使用技巧)
查看>>
mutiplemap 总结
查看>>
MySQL DELETE 表别名问题
查看>>
MySQL Error Handling in Stored Procedures---转载
查看>>
MVC 区域功能
查看>>
MySQL FEDERATED 提示
查看>>
mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
查看>>
Mysql group by
查看>>
MySQL I 有福啦,窗口函数大大提高了取数的效率!
查看>>
mysql id自动增长 初始值 Mysql重置auto_increment初始值
查看>>
MySQL in 太多过慢的 3 种解决方案
查看>>