????????偶然看到这篇阿里大佬用的技术https://blog.csdn.net/weixin_57907028/article/details/119152058? ?,我也来写一篇 ? ?
?整体介绍
?????????项目中有大量的状态值,当状态值需要改动时,涉及到的地方特别多,容易漏。经过多年多个项目的迭代,优化整理出来的。主要有三个类:
- 接口IBaseEnum:主要提供枚举类的静态方法(1.8后可以写静态与默认方法),主要是转换。
- 例如Excel数据导入,状态是中文,存到数据库用数字或字符串,可以用parseByName方法;
- 从数据库读出来页面显示用中文时,可以用parse方法。
- 页面上下拉框选择,可以通过getPropList方法取得枚举所有选项
- val、code用于数据库存储,
- name用于后台或内部显示、
- dispName用于前台页面显示、dispHtml用于状态带样式显示,可以让整个平台风格一致,EnumProp对象可以转换成json对象,在前端就可以直接使用
- 具体枚举类,例如季节定义ESeason,每添加一个枚举只需要关注枚举项和描述即可
?枚举的使用
public static void main(String[] args) {
// 通过val转换成枚举对象
ESeason eSpring = IBaseEnum.parse(ESeason.class, 1);
System.out.println(eSpring.getDispName());
System.out.println();
// 通过code转换成枚举对象
ESeason eSummer = IBaseEnum.parse(ESeason.class, "SUMMER");
System.out.println(eSummer.getDispName());
System.out.println();
// 取得枚举的所有属性
List<EnumProp> list = IBaseEnum.getPropList(ESeason.class);
for (EnumProp tmp : list) {
System.out.println(tmp.getDispName());
}
}
具体代码如下:
/** */
package com.wjz.common.utils.enums;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
* 公共枚举接口
* @author: 王金洲 2021-03-02 10:18:01
*/
public interface IBaseEnum {
/**
* 根据val返回枚举
* @param ec
* @param val
* @return
* @author wangjz 2018年12月12日上午9:56:11
*/
public static <T extends IBaseEnum> T parse(Class<T> ec, Integer val) {
for (T t : ec.getEnumConstants()) {
if (t.getProp().getVal().equals(val)) {
return t;
}
}
return null;
}
/**
* 根据code返回枚举
* @param ec
* @param code
* @return
* @author wangjz 2018年12月12日上午9:56:11
*/
public static <T extends IBaseEnum> T parse(Class<T> ec, String code) {
for (T t : ec.getEnumConstants()) {
if (t.getProp().getCode().equals(code)) {
return t;
}
}
return null;
}
/**
* 根据name返回枚举
* @param ec
* @param name
* @return
* @author songjy 2019年11月25日上午9:56:11
*/
public static <T extends IBaseEnum> T parseByName(Class<T> ec, String name) {
for (T t : ec.getEnumConstants()) {
if (t.getProp().getName().equals(name)) {
return t;
}
}
return null;
}
/**
* 获取某一枚举类的所有枚举值,返回List
* @param ec
* @return
* @author: wangjz 2018年6月6日下午6:25:51
*/
public static <T extends IBaseEnum> List<EnumProp> getPropList(Class<T> ec) {
List<EnumProp> list = new ArrayList<>();
for (T t : ec.getEnumConstants()) {
list.add(t.getProp());
}
return list;
}
/**
* 判断val是否相同
* @param val
* @return
* @author: 王金洲 2021-03-02 10:10:56
*/
default boolean eq(Integer val) {
return getProp().getVal().equals(val);
}
/**
* 判断code是否相同
* @param code
* @return
* @author: 王金洲 2021-03-02 10:10:59
*/
default boolean eq(String code) {
return getProp().getCode().equals(code);
}
/** 取得 枚举key */
default String getEnumKey() {
return getProp().getEnumKey();
}
/** @取得 状态值 */
default Integer getVal() {
return getProp().getVal();
}
/** @取得 状态编号 */
default String getCode() {
return getProp().getCode();
}
/** @取得 状态名称 */
default String getName() {
return getProp().getName();
}
/** @取得 显示名称 */
default String getDispName() {
return getProp().getDispName();
}
/** @取得 html显示样式 */
default String getDispHtml() {
return getProp().getDispHtml();
}
/** 获取枚举的描述信息 */
public String getRemark();
/** @取得 枚举状态信息 */
public EnumProp getProp();
}
????????val、code用于数据库存储,name用于后台显示、dispName用于前台页面显示、dispHtml用于状态带样式显示,可以让整个平台风格一致。EnumProp对象可以转换成json对象,在前端就可以直接使用
/** */
package com.wjz.common.utils.enums;
import com.wjz.common.utils.json.JsonUtils;
/**
* 枚举中用到的属性
* @author: 王金洲 2021-07-29 14:50:52
*/
public class EnumProp {
/** 枚举key */
private String enumKey;
/** 状态值 */
private Integer val;
/** 状态编号 */
private String code;
/** 状态名称 */
private String name;
/** 显示名称 */
private String dispName;
/** html显示样式 */
private String dispHtml;
/**
* 构造函数
*/
public EnumProp() {
super();
}
/**
* 构造函数
* @param val
*/
public EnumProp(Integer val) {
this(val, null, null, null, null);
}
/**
* 构造函数
* @param code
*/
public EnumProp(String code) {
this(null, code, null, null, null);
}
/**
* 构造函数
* @param val
* @param name
*/
public EnumProp(Integer val, String name) {
this(val, null, name, null, null);
}
/**
* 构造函数
* @param code
* @param name
*/
public EnumProp(String code, String name) {
this(null, code, name, null, null);
}
/**
* 构造函数
* @param val
* @param code
* @param name
*/
public EnumProp(Integer val, String code, String name) {
this(val, code, name, null, null);
}
/**
* 构造函数
* @param val
* @param code
* @param name
* @param dispName
*/
public EnumProp(Integer val, String code, String name, String dispName) {
this(val, code, name, dispName, null);
}
/**
* 构造函数
* @param val
* @param code
* @param name
* @param dispName
* @param dispHtml
*/
public EnumProp(Integer val, String code, String name, String dispName, String dispHtml) {
super();
this.val = val;
this.code = code;
this.name = name;
this.dispName = dispName;
this.dispHtml = dispHtml;
if (code == null) {
this.code = val.toString();
}
if (name == null) {
this.name = this.code;
}
if (dispName == null) {
this.dispName = this.name;
}
}
/** 取得 枚举key */
public String getEnumKey() {
return enumKey;
}
/** 设置 枚举key */
public void setEnumKey(String enumKey) {
this.enumKey = enumKey;
}
/** @取得 状态值 */
public Integer getVal() {
return val;
}
/** @设置 状态值 */
public void setVal(Integer val) {
this.val = val;
}
/** @取得 状态编号 */
public String getCode() {
return code;
}
/** @设置 状态编号 */
public void setCode(String code) {
this.code = code;
}
/** @取得 状态名称 */
public String getName() {
return name;
}
/** @设置 状态名称 */
public void setName(String name) {
this.name = name;
}
/** @取得 显示名称 */
public String getDispName() {
return dispName;
}
/** @设置 显示名称 */
public void setDispName(String dispName) {
this.dispName = dispName;
}
/** @取得 html显示样式 */
public String getDispHtml() {
return dispHtml;
}
/** @设置 html显示样式 */
public void setDispHtml(String dispHtml) {
this.dispHtml = dispHtml;
}
/**
* override
* @return
* @author wangjz 2018年9月25日下午1:36:02
*/
@Override
public String toString() {
return JsonUtils.getString(this);
}
}
例如季节定义ESeason,让每个枚举只需要定义枚举项和描述即可
/** */
package com.wjz.common.utils.enums;
/**
* @author: 王金洲 2021-07-29 14:58:32
*/
public enum ESeason implements IBaseEnum {
/** 春天 */
SPRING(new EnumProp(1, "春天")),
/** 夏天 */
SUMMER(new EnumProp(2, "SUMMER", "夏天")),
/** 秋天 */
AUTUMN(new EnumProp(2, "AUTUMN", "秋天", "秋天", "<b style='color:yellow'>秋天</b>")),
/** 冬天 */
WINTER(new EnumProp(2, "WINTER", "冬天", "冬天", "<b style='color:yellow'>冬天</b>")),;
@Override
public String getRemark() {
return "季节定义";
}
/** ================ 以下信息基本不用变 ====================== */
/** 枚举状态信息 */
private EnumProp prop;
/**
* 构造函数
* @param val
* @param name
*/
private ESeason(EnumProp prop) {
prop.setEnumKey(toString());
this.prop = prop;
}
/** @取得 枚举状态信息 */
@Override
public EnumProp getProp() {
return prop;
}
}
|