1.首先新建一个类存放枚举信息
public class DictItemBean {
private String value;
private String label;
public static DictItemBean of(String value, String label) {
final DictItemBean dictItemBean = new DictItemBean();
dictItemBean.setValue(value);
dictItemBean.setLabel(label);
return dictItemBean;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}
2.定义一个静态数据池,存放枚举信息
public class StaticDictPool {
/**
* 用于存储字典数据
*/
private static final Map<IDictItem, DictItemBean> dictItemMap = new ConcurrentHashMap<>();
private StaticDictPool() {
}
/**
* 往 map 中添加代码项
*/
public static void putDictItem(IDictItem iCodeItem, String value, String label) {
dictItemMap.put(iCodeItem, DictItemBean.of(value, label));
}
/**
* 获取静态数据
*/
static DictItemBean getDictItem(IDictItem iCodeItem) {
return dictItemMap.get(iCodeItem);
}
}
3.定义一个接口,接口默认的方法从池子中获取枚举信息
public interface IDictItem {
/**
* 通过value来获取enumClass中匹配的枚举对象
*
* @param enumClass 枚举类
* @param value 代码
* @param <T> 模板类型
* @return 如果 enumClass为空, 返回 null, 否则返回枚举类中第一个匹配value的枚举对象
*/
static <T extends IDictItem> T getByValue(Class<T> enumClass, String value) {
if (enumClass == null) {
return null;
}
//通过反射取出Enum所有常量的属性值
for (T each : enumClass.getEnumConstants()) {
//利用value进行循环比较,获取对应的枚举
if (value.equals(each.value())) {
return each;
}
}
return null;
}
/**
* 通过label来获取enumClass中匹配的枚举对象
*
* @param enumClass 枚举类
* @param label 代码
* @param <T> 模板类型
* @return 如果 enumClass为空, 返回 null, 否则返回枚举类中第一个匹配label的枚举对象
*/
static <T extends IDictItem> T getByLabel(Class<T> enumClass, String label) {
if (enumClass == null) {
return null;
}
//通过反射取出Enum所有常量的属性值
for (T each : enumClass.getEnumConstants()) {
//利用value进行循环比较,获取对应的枚举
if (label.trim().equals(each.label())) {
return each;
}
}
return null;
}
/**
* 通过 value 来获取 label
*
* @param enumClass 枚举类
* @param value 枚举代码
* @param <T> 模板类型
* @return 如果 value为空
*/
static <T extends IDictItem> String getLabelByValue(Class<T> enumClass, String value) {
if (value == null) {
return "";
}
IDictItem byValue = getByValue(enumClass, value);
if (null == byValue) {
return value;
}
return byValue.label();
}
/**
* 通过 label 来获取 value
*
* @param enumClass 枚举类
* @param label 枚举代码
* @param <T> 模板类型
* @return 如果 value为空
*/
static <T extends IDictItem> String getValueByLabel(Class<T> enumClass, String label) {
if (label == null) {
return "";
}
label = label.trim();
IDictItem byValue = getByLabel(enumClass, label);
if (null == byValue) {
return label;
}
return byValue.value();
}
String name();
default String value() {
return getItemBean().getValue();
}
default String label() {
return getItemBean().getLabel();
}
default DictItemBean getItemBean() {
return StaticDictPool.getDictItem(this);
}
default boolean isValue(String value) {
return StringUtils.isNotBlank(value) && value.endsWith(value());
}
}
4.自定义枚举,并将枚举添加到数据池中
public interface ArpArticleEnum {
/**
* 发布状态 (0初始状态 1上架状态 2下架状态)
*/
enum ReleaseStatus implements IDictItem {
INITIAL("0", "初始状态"), ON("1", "上架状态"), OFF("2", "下架状态");
ReleaseStatus(String value, String label) {
StaticDictPool.putDictItem(this, value, label);
}
}
/**
* 审核状态 (0待审核 1审核通过 2审核未通过)
*/
enum AuditStatus implements IDictItem {
INITIAL("0", "待审核"), PASS("1", "审核通过"), FAILED("2", "审核未通过");
AuditStatus(String value, String label) {
StaticDictPool.putDictItem(this, value, label);
}
}
}
5、代码中应用
6.添加工具方法,从value中获取label
public class IDictMultiItem {
public static final String SPLIT_SYMBOL = ",";
private IDictMultiItem() {
}
/**
* 通过value来获取enumClass中匹配的枚举对象
*
* @param enumClass 枚举类
* @param value 代码
* @param <T> 模板类型
* @return 如果 enumClass为空, 返回 null, 否则返回枚举类中第一个匹配value的枚举对象
*/
public static <T extends IDictItem> List<T> getByValue(Class<T> enumClass, String value) {
if (enumClass == null || value.isEmpty()) {
return Collections.emptyList();
}
String[] arr = value.split(SPLIT_SYMBOL);
List<T> list = new ArrayList<>(arr.length);
for (String str : arr) {
//通过反射取出Enum所有常量的属性值
for (T each : enumClass.getEnumConstants()) {
//利用value进行循环比较,获取对应的枚举
if (str.equals(each.value())) {
list.add(each);
break;
}
}
}
return list;
}
/**
* 通过label来获取enumClass中匹配的枚举对象
*
* @param enumClass 枚举类
* @param label 代码
* @param <T> 模板类型
* @return 如果 enumClass为空, 返回 null, 否则返回枚举类中第一个匹配label的枚举对象
*/
public static <T extends IDictItem> List<T> getByLabel(Class<T> enumClass, String label) {
if (enumClass == null || label.isEmpty()) {
return Collections.emptyList();
}
String[] arr = label.split(SPLIT_SYMBOL);
List<T> list = new ArrayList<>(arr.length);
for (String str : arr) {
//通过反射取出Enum所有常量的属性值
for (T each : enumClass.getEnumConstants()) {
//利用value进行循环比较,获取对应的枚举
if (str.equals(each.label())) {
list.add(each);
break;
}
}
}
return list;
}
/**
* 通过 value 来获取 label
*
* @param enumClass 枚举类
* @param value 枚举代码
* @param <T> 模板类型
* @return 如果 value为空
*/
public static <T extends IDictItem> String getLabelByValue(Class<T> enumClass, String value) {
if (value == null) {
return "";
}
List<T> list = getByValue(enumClass, value);
if (list.isEmpty()) {
return value;
}
return list.stream().map(IDictItem::label).collect(Collectors.joining(SPLIT_SYMBOL));
}
/**
* 通过 label 来获取 value
*
* @param enumClass 枚举类
* @param label 枚举代码
* @param <T> 模板类型
* @return 如果 value为空
*/
static <T extends IDictItem> String getValueByLabel(Class<T> enumClass, String label) {
if (label == null) {
return "";
}
List<T> list = getByValue(enumClass, label);
if (list.isEmpty()) {
return label;
}
return list.stream().map(IDictItem::value).collect(Collectors.joining(SPLIT_SYMBOL));
}
}