定义枚举元素通用接口
public interface EnumItem<V> extends Serializable {
String name();
/**
* 获取枚举的value值
* @return 枚举的value值
*/
V getValue();
/**
* 在中文语境下,多数情况枚举会配合一个中文说明
*
* @return 中文说明
*/
default String getText() {
return name();
}
}
Util工具
public class EnumItemUtil {
private EnumItemUtil() {
}
/**
* 获取所有枚举项
* @param enumType 枚举类型
* @param <T> EnumItem
* @return 枚举项列表
*/
public static <T extends EnumItem<?>> List<T> getEnumItems(Class<T> enumType) {
return Arrays.asList(enumType.getEnumConstants());
}
/**
* 获取所有枚举value值
* @param enumType 枚举类型
* @param <T> EnumItem
* @param <V> value泛型
* @return 枚举value值列表
*/
public static <V, T extends EnumItem<V>> List<V> getEnumValues(Class<T> enumType) {
return Arrays.stream(enumType.getEnumConstants()).map(EnumItem::getValue).collect(Collectors.toList());
}
/**
* 获取所有枚举text值
* @param enumType 枚举类型
* @param <T> EnumItem
* @return 枚举text值列表
*/
public static <T extends EnumItem<?>> List<String> getEnumTexts(Class<T> enumType) {
return Arrays.stream(enumType.getEnumConstants()).map(EnumItem::getText).collect(Collectors.toList());
}
/**
* 根据value值查询对应的枚举项
* @param enumType 枚举类型
* @param value 枚举value
* @param <T> EnumItem
* @param <V> value泛型
* @return 枚举项
*/
public static <V, T extends EnumItem<V>> T fromValue(Class<T> enumType, V value) {
if(value == null) {
return null;
}
for (T enumItem : enumType.getEnumConstants()) {
if(Objects.equals(value, enumItem.getValue())) {
return enumItem;
}
}
return null;
}
}
测试
public enum SexEnum implements EnumItem<String> {
MALE("0","男"),
FEMALE("1", "女"),
;
private final String value;
private final String text;
SexEnum(String value, String text) {
this.value = value;
this.text = text;
}
@Override
public String getValue() {
return value;
}
@Override
public String getText() {
return text;
}
}
public class TestEnum {
public static void main(String[] args) {
System.out.println(EnumItemUtil.getEnumItems(SexEnum.class)); // [MALE, FEMALE]
System.out.println(EnumItemUtil.getEnumValues(SexEnum.class));// [0, 1]
System.out.println(EnumItemUtil.getEnumTexts(SexEnum.class)); // [男, 女]
System.out.println(EnumItemUtil.fromValue(SexEnum.class, "1")); // FEMALE
}
}