java enum code-label模式的使用方法
通常我们定义的枚举类都会有两个字段:code、label,然后我们有会需要两个方法:
1.根据code获得枚举实例对象:getByCode
2.根据code获得对应的label:getLabelByCode
当然可以在每个枚举类中实现这两个方法,但是会发现这两个方法逻辑完全一致,但是又必须每次都写,代码不够简洁,有重复造轮子的嫌疑。
下面给出一种实现方式,解决重复造轮子的问题。
1.创建公共接口
public interface EnumInterface {
String getCode();
String getLabel();
}
2.创建枚举类并实现接口
public enum PlanTypeEnum implements EnumInterface {
WEEK_PLAN {
@Override
public String getCode() {
return "week_plan";
}
@Override
public String getLabel() {
return "周计划";
}
},
DAY_PLAN {
@Override
public String getCode() {
return "day_plan";
}
@Override
public String getLabel() {
return "日计划";
}
},
TEMP_PLAN {
@Override
public String getCode() {
return "temp_plan";
}
@Override
public String getLabel() {
return "临时计划";
}
}
}
3.创建工具类
public class CodeEnumUtil {
private CodeEnumUtil() {}
/**
* 根据code获取枚举
* @param clazz 枚举类
* @param code code
* @return 枚举
*/
public static EnumInterface getByCode(Class<? extends Enum<?>> clazz, String code) {
final Enum<?>[] enums = clazz.getEnumConstants();
for (Enum<?> e : enums) {
if (e instanceof EnumInterface) {
EnumInterface enumInterface = (EnumInterface) e;
if (enumInterface.getCode().equalsIgnoreCase(code)) {
return enumInterface;
}
}
}
return null;
}
/**
* 没有找到时,返回code
*
* @param code code
* @return label
*/
public static String getLabelByCode(Class<? extends Enum<?>> clazz, String code) {
EnumInterface enumInterface = getByCode(clazz, code);
if (enumInterface == null) {
return code;
}
return enumInterface.getLabel();
}
}
4.使用
CodeEnumUtil.getLabelByCode(PlanTypeEnum.class,"week_plan")