当前位置:   article > 正文

JAVA 中 Switch引用Enum问题

switch enum java不管用

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

  1. public enum ContentTypeEnum{
  2. TEXT(0,"文本"),
  3. VEDIO(1,"视频"),
  4. LINK(2,"链接"),
  5. CODE(3,"代码"),
  6. TITLE(4,"标题"),
  7. KPOINT(5,"知识点");
  8. //这个枚举有两个变量 code 和 msg
  9. private Integer code;
  10. private String msg;
  11. private ContentTypeEnum(Integer code, String msg) {
  12. this.code = code;
  13. this.msg = msg;
  14. }
  15. public Integer getCode() {
  16. return code;
  17. }
  18. public String getMsg() {
  19. return msg;
  20. }
  21. }

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

开始我是这样写的:

  1. switch (code) {
  2. case ContentTypeEnum.TEXT.getCode:
  3. //校验文本内容不能为空
  4. if(StringUtils.isEmpty(econtent.getContent())){
  5. throw new RuntimeException("【addExperimentContent】 文本内容不能为空");
  6. }
  7. //文件存放路径不能为空
  8. if(StringUtils.isEmpty(econtent.getContentPath())){
  9. throw new RuntimeException("【addExperimentContent】 文件存放路径不能为空");
  10. }
  11. break;
  12. }

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

  1. //传入一个ContentTypeEnum 枚举的对象进行匹配
  2. switch (contentTypeEnum) {
  3. case TEXT:
  4. //校验文本内容不能为空
  5. if(StringUtils.isEmpty(econtent.getContent())){
  6. throw new RuntimeException("【addExperimentContent】 文本内容不能为空");
  7. }
  8. //文件存放路径不能为空
  9. if(StringUtils.isEmpty(econtent.getContentPath())){
  10. throw new RuntimeException("【addExperimentContent】 文件存放路径不能为空");
  11. }
  12. break;
  13. }

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

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

  1. public interface CodeEnum {
  2. Integer getCode();
  3. }

     

  1. public enum ContentTypeEnum implements CodeEnum{
  2. TEXT(0,"文本"),
  3. VEDIO(1,"视频"),
  4. LINK(2,"链接"),
  5. CODE(3,"代码"),
  6. TITLE(4,"标题"),
  7. KPOINT(5,"知识点");
  8. //这个枚举有两个变量 code 和 msg
  9. private Integer code;
  10. private String msg;
  11. private ContentTypeEnum(Integer code, String msg) {
  12. this.code = code;
  13. this.msg = msg;
  14. }
  15. public Integer getCode() {
  16. return code;
  17. }
  18. public String getMsg() {
  19. return msg;
  20. }
  21. }

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

  1. public class EnumUtils {
  2. public static <T extends CodeEnum>T getEnumByType(Integer code,Class<T> enumClass){
  3. for(T t:enumClass.getEnumConstants()){
  4. if(t.getCode().equals(code)){
  5. return t;
  6. }
  7. }
  8. return null;
  9. }
  10. }

 

3.switch引用enum:

  1. //这里的code是我在实际项目中从其他地方传来的标识,对应枚举中具体的一个元素code。
  2. switch (EnumUtils.getEnumByType(code,ContentTypeEnum.class)) {
  3. case TEXT:
  4. //校验文本内容不能为空
  5. if(StringUtils.isEmpty(econtent.getContent())){
  6. throw new RuntimeException("【addExperimentContent】 文本内容不能为空");
  7. }
  8. //文件存放路径不能为空
  9. if(StringUtils.isEmpty(econtent.getContentPath())){
  10. throw new RuntimeException("【addExperimentContent】 文件存放路径不能为空");
  11. }
  12. break;
  13. }

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

转载于:https://my.oschina.net/linwl/blog/1816943

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/729147
推荐阅读
相关标签
  

闽ICP备14008679号