JAVA 中 Switch引用Enum问题

首先我们定义一个Enum枚举类,用以举例:

public enum ContentTypeEnum{
	TEXT(0,"文本"),
	VEDIO(1,"视频"),
	LINK(2,"链接"),
	CODE(3,"代码"),
	TITLE(4,"标题"),
	KPOINT(5,"知识点");
	
	//这个枚举有两个变量 code  和 msg
	private Integer code;
	private String msg;
	
	private ContentTypeEnum(Integer code, String msg) {
		this.code = code;
		this.msg = msg;
	}

	public Integer getCode() {
		return code;
	}

	public String getMsg() {
		return msg;
	}
}

而我们的项目中有这样的需求:传入对应的code,需要跟枚举中对应元素进行匹配,如何做呢?

开始我是这样写的:

	switch (code) {
		case ContentTypeEnum.TEXT.getCode:
			//校验文本内容不能为空 
			if(StringUtils.isEmpty(econtent.getContent())){
				throw new RuntimeException("【addExperimentContent】 文本内容不能为空");
			}
			//文件存放路径不能为空
			if(StringUtils.isEmpty(econtent.getContentPath())){
				throw new RuntimeException("【addExperimentContent】 文件存放路径不能为空");
			}
			break;
    }

但很遗憾,JAVA并不允许我们这样写。我翻阅了JAVA文档,它允许我们这样:传入一个枚举的对象进行匹配,这样是可以的:

​
    //传入一个ContentTypeEnum 枚举的对象进行匹配
	switch (contentTypeEnum) {
		case TEXT:
			//校验文本内容不能为空 
			if(StringUtils.isEmpty(econtent.getContent())){
				throw new RuntimeException("【addExperimentContent】 文本内容不能为空");
			}
			//文件存放路径不能为空
			if(StringUtils.isEmpty(econtent.getContentPath())){
				throw new RuntimeException("【addExperimentContent】 文件存放路径不能为空");
			}
			break;
    }

​

但是我们拿到的是一个code参数啊,有解决办法吗?当然!解决办法如下:

1.定义一个enum接口,并然具体的enum实现接口:

public interface CodeEnum {
	
	 Integer getCode();

}

     

public enum ContentTypeEnum implements CodeEnum{
	TEXT(0,"文本"),
	VEDIO(1,"视频"),
	LINK(2,"链接"),
	CODE(3,"代码"),
	TITLE(4,"标题"),
	KPOINT(5,"知识点");
	
	//这个枚举有两个变量 code  和 msg
	private Integer code;
	private String msg;
	
	private ContentTypeEnum(Integer code, String msg) {
		this.code = code;
		this.msg = msg;
	}

	public Integer getCode() {
		return code;
	}

	public String getMsg() {
		return msg;
	}
}

2.定义一个泛型工具类,用于获取具体code(定义泛型是为了方便其他enum也可以使用):

public class EnumUtils {
	
	public static <T extends CodeEnum>T getEnumByType(Integer code,Class<T> enumClass){
		for(T t:enumClass.getEnumConstants()){
			if(t.getCode().equals(code)){
				return t;
			}
		}
		return null;
	}

}

3.switch引用enum:

switch (EnumUtils.getEnumByType(econtent.getContentType(),ContentTypeEnum.class)) {
		case TEXT:
			//校验文本内容不能为空 
			if(StringUtils.isEmpty(econtent.getContent())){
				throw new RuntimeException("【addExperimentContent】 文本内容不能为空");
			}
			//文件存放路径不能为空
			if(StringUtils.isEmpty(econtent.getContentPath())){
				throw new RuntimeException("【addExperimentContent】 文件存放路径不能为空");
			}
			break;
}

讲解完毕,不理解请留言。

猜你喜欢

转载自my.oschina.net/u/3361262/blog/1816943