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

本文共 2607 字,大约阅读时间需要 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
@Data
public 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/

你可能感兴趣的文章
Objective-C实现2d 表面渲染 3d 点算法(附完整源码)
查看>>
Objective-C实现2D变换算法(附完整源码)
查看>>
Objective-C实现3n+1猜想(附完整源码)
查看>>
Objective-C实现3n+1猜想(附完整源码)
查看>>
Objective-C实现9x9乘法表算法(附完整源码)
查看>>
Objective-C实现9×9二维数组数独算法(附完整源码)
查看>>
Objective-C实现A*(A-Star)算法(附完整源码)
查看>>
Objective-C实现A-Star算法(附完整源码)
查看>>
Objective-C实现abbreviation缩写算法(附完整源码)
查看>>
Objective-C实现ABC人工蜂群算法(附完整源码)
查看>>
Objective-C实现activity selection活动选择问题算法(附完整源码)
查看>>
Objective-C实现AC算法(Aho-Corasick) 算法(附完整源码)
查看>>
Objective-C实现adaboost算法(附完整源码)
查看>>
Objective-C实现Adler32算法(附完整源码)
查看>>
Objective-C实现AES算法(附完整源码)
查看>>
Objective-C实现AffineCipher仿射密码算法(附完整源码)
查看>>
Objective-C实现aliquot sum等分求和算法(附完整源码)
查看>>
Objective-C实现all combinations所有组合算法(附完整源码)
查看>>
Objective-C实现all permutations所有排列算法(附完整源码)
查看>>
Objective-C实现all subsequences所有子序列算法(附完整源码)
查看>>