需求:
项目上遇到需求是用枚举实现菜单的回显,这就需要使用菜单实现分组并且还满足一个二级分组,结果百度了白天居然没有找到正经的资料,只能自己上手实现了,在这里记录一下,直接上代码类了!
实现逻辑为 枚举类的按照接口实现枚举的方法,因为我需要两级嵌套枚举,所以使用下面的方法实现,如果只要分组也可以直接使用接口的实现方式,那个下次在写
import cn.com.jit.application.dwork.rights.resources.pojo.bo.ResourceSubclassBO;
import cn.com.jit.application.dwork.rights.resources.pojo.vo.ResourceVO;
import lombok.Getter;
import java.util.ArrayList;
import java.util.List;
/**
* 资源枚举类
*
* @author 段旭东
* @date 2022.03.31
*/
@Getter
public enum ResourcesEnum {
/**
* 项目管理
*/
PROJECT_MANAGEMENT(100000, "项目管理", Element.project.class),
/**
* 人员管理
*/
USER_MANAGEMENT(200000, "人员管理", Element.user.class);
/**
* 资源子元素接口
*
* @author 段旭东
* @date 2022.04.01
*/
public interface Element {
/**
* 获得资源子类
*
* @return {@link ResourceSubclassBO} 资源子类对象
*/
ResourceSubclassBO getResourceSubclass();
/**
* 项目
*
* @author 段旭东
* @date 2022.04.01
*/
enum project implements Element {
ADD {
@Override
public ResourceSubclassBO getResourceSubclass() {
return ResourceSubclassBO.builder().code(10010).annotate("新增项目").build();
}
}, UPDATE {
@Override
public ResourceSubclassBO getResourceSubclass() {
return ResourceSubclassBO.builder().code(10020).annotate("更新项目").build();
}
}, REMOVE {
@Override
public ResourceSubclassBO getResourceSubclass() {
return ResourceSubclassBO.builder().code(10030).annotate("删除项目").build();
}
};
}
/**
* 用户
*
* @author 段旭东
* @date 2022.04.01
*/
enum user implements Element {
ADD {
@Override
public ResourceSubclassBO getResourceSubclass() {
return ResourceSubclassBO.builder().code(20010).annotate("新增人员").build();
}
}, UPDATE {
@Override
public ResourceSubclassBO getResourceSubclass() {
return ResourceSubclassBO.builder().code(20010).annotate("修改人员").build();
}
}, REMOVE {
@Override
public ResourceSubclassBO getResourceSubclass() {
return ResourceSubclassBO.builder().code(20010).annotate("删除人员项目").build();
}
};
}
}
/**
* 代码
*/
private final int code;
/**
* 注释
*/
private final String annotate;
/**
* 资源下元素集合
*/
private final Element[] elements;
/**
* 资源枚举
*
* @param code 代码
* @param annotate 注释
* @param elements 元素
*/
ResourcesEnum(int code, String annotate, Class<? extends Element> elements) {
this.code = code;
this.annotate = annotate;
this.elements = elements.getEnumConstants();
}
/**
* 转换集合对象
* 用于枚举直接返回list集合
*
* @return {@link List}<{@link ResourceVO}>
*/
public static List<ResourceVO> toList() {
// 定义返回集合
List<ResourceVO> list = new ArrayList<>();
// 遍历资源枚举
for (ResourcesEnum resourcesEnum : ResourcesEnum.values()) {
// 定义返回前端枚举对象
ResourceVO resourceVO = new ResourceVO();
// 放入资源Code
resourceVO.setCode(resourcesEnum.getCode());
// 放入资源注释
resourceVO.setAnnotate(resourcesEnum.getAnnotate());
// 定义资源下子资源的返回集合
List<ResourceSubclassBO> resourceSubclassList = new ArrayList<>();
// 获取子资源枚举集合
Element[] elements = resourcesEnum.getElements();
// 子资源可能为空,所以做非空验证
if (elements != null && elements.length > 0) {
// 遍历子资源
for (Element element : elements) {
// 放入到子资源集合中
resourceSubclassList.add(ResourceSubclassBO
.builder()
// 放入子资源code
.code(element.getResourceSubclass().getCode())
// 放入子资源注释
.annotate(element.getResourceSubclass().getAnnotate())
.build());
}
}
// 将子资源集合放入到资源视图对象中
resourceVO.setResourceSubclassList(resourceSubclassList);
// 返回集合中加入资源视图对象
list.add(resourceVO);
}
return list;
}
}
我使用了一个类用于子枚举类的自定义返回对象,用于业务扩展使用
import lombok.Builder;
import lombok.Data;
/**
* 资源子类业务对象
*
* @author 段旭东
* @date 2022.04.01
*/
@Data
@Builder
public class ResourceSubclassBO {
/**
* 代码
*/
private Integer code;
/**
* 注释
*/
private String annotate;
}
如何使用:
public static void main(String[] args) {
System.out.println(ResourcesEnum.toList());
// 也可以自己在实际的类中复制一遍 toList 方法里面的代码
}
输出效果:
[ResourceVO(code=100000, annotate=项目管理,
resourceSubclassList=
[
ResourceSubclassBO(code=10010, annotate=新增项目) ,
ResourceSubclassBO(code=10020, annotate=更新项目),
ResourceSubclassBO(code=10030, annotate=删除项目)
]),
ResourceVO(code=200000, annotate=人员管理,
resourceSubclassList=
[
ResourceSubclassBO(code=20010, annotate=新增人员),
ResourceSubclassBO(code=20010, annotate=修改人员),
ResourceSubclassBO(code=20010, annotate=删除人员项目)
])]