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

你可能感兴趣的文章
Nerves 项目教程
查看>>
nessus快速安装使用指南(非常详细)零基础入门到精通,收藏这一篇就够了
查看>>
Nessus漏洞扫描教程之配置Nessus
查看>>
Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
查看>>
nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML.
查看>>
nestesd exception is java .lang.NoSuchMethodError:com.goolge.common.collect
查看>>
nestJS学习
查看>>
net core 环境部署的坑
查看>>
NET Framework安装失败的麻烦
查看>>
Net 应用程序如何在32位操作系统下申请超过2G的内存
查看>>
Net.Framework概述
查看>>
NET3.0+中使软件发出声音[整理篇]<转>
查看>>
net::err_aborted 错误码 404
查看>>
NetApp凭借领先的混合云数据与服务把握数字化转型机遇
查看>>
NetAssist网络调试工具使用指南 (附NetAssist工具包)
查看>>
Netbeans 8.1启动参数配置
查看>>
NetBeans IDE8.0需要JDK1.7及以上版本
查看>>
NetBeans之JSP开发环境的搭建...
查看>>
NetBeans之改变难看的JSP脚本标签的背景色...
查看>>
netbeans生成的maven工程没有web.xml文件 如何新建
查看>>