大部分系统很多时候需要定义很多系统常量,前端需要从后台获取,普通的方法是一个枚举写一个,对于大量枚举类类似这样
想到一个优化方法可以借鉴
定义枚举定义接口
public interface IConstant {
Integer getValue();
String getName();
List<ValueName> valueNames();
}
枚举实现接口
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class ValueName {
private int value;
private String name;
}
import java.lang.annotation.*;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Constant {
String value() default "";
}
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Constant("gender")
public enum GenderEnum implements IConstant {
MALE(0, "男"),
FEMALE(1, "女");
private Integer value;
private String name;
GenderEnum(Integer value, String name) {
this.value = value;
this.name = name;
}
@Override
public List<ValueName> valueNames() {
return Stream.of(values())
.map(v -> new ValueName(v.getValue(), v.getName()))
.collect(Collectors.toList());
}
@Override
public Integer getValue() {
return value;
}
@Override
public String getName() {
return name;
}
}
获取枚举controller接口
private static ConcurrentMap<String, List<ValueName>> CNT_CACHE = new ConcurrentHashMap<>();
@GetMapping("/constant/value_list")
@ApiOperation("查询系统枚举数据")
public ApiResult findConstantValueList(@RequestParam String name) {
return ApiResult.success(CNT_CACHE.get(name));
}
static {
Set<String> keys = CNT_CACHE.keySet();
if (keys.isEmpty()) {
synchronized (CNT_CACHE) {
if (keys.isEmpty()) {
Package pkg = GenderEnum.class.getPackage();
Reflections reflections = new Reflections(pkg.getName());
reflections.getTypesAnnotatedWith(Constant.class)
.forEach(clz -> {
try {
if (clz.isEnum()) {
Object[] objects = clz.getEnumConstants();
Constant cEnum = clz.getAnnotation(Constant.class);
IConstant constant = ((IConstant) objects[0]);
CNT_CACHE.put(cEnum.value(), constant.valueNames());
}
} catch (Exception e) {
log.error("", e);
}
});
}
}
}
}
对这就是反射的魅力 可以减少很多代码
一个喜欢思考的少年