【问题标题】:Switch on Enum when strings contain dash当字符串包含破折号时打开枚举
【发布时间】:2013-03-17 23:47:12
【问题描述】:

我想使用枚举作为切换字符串的一种方式,但是 java 抱怨我的字符串包含“-”。如下代码所示,IC19-01 和 IC19-02 包含“-”。

public class CMain {
    public enum Model {
        IC19-01, IC19-02
    }

    public static void main(String[] args){
        String st = "IC19-01"; 
        switch (Model.valueOf(st)) {
            case IC19-01: 
                System.out.println("Case IC19-01");
                break;
        }
    }
}

我能做些什么呢?

【问题讨论】:

  • 为什么不用_(下划线)替换-
  • 只有当这是最后一个选项时,我才会这样做。如果可能的话,我想保持我的代码干净。

标签: java enums switch-statement


【解决方案1】:

这在 Java 中是不可能的,因为每个项目都必须是一个有效的标识符(并且有效的 Java 标识符可能不包含破折号)。

【讨论】:

    【解决方案2】:

    这在 Java 中是不可能的。但是你可以做你自己的实现作为一种解决方法,尽管它会产生更多的代码。您可以更改您的enum,如下所示:

     public enum Model {
        IC19_01("IC19-01"), 
        IC19_02("IC19-02")
    
        private final String name;
    
        private Model(String name){
         this.name = name;
        }
    
        public String getName(){
           return name;
        }
    
       public static Model getByName(String aName){
             for(Model current: Model.values()){
               if(current.getName().equalsIgnoreCase(aName.trim())){
                  return current;
               }
              }
              return null;
        }
    }
    

    那么您应该可以调用Model.getByName(st) 而不是Model.valueOf。或者,在 Java 7 中,您应该能够切换实际的 String

    【讨论】:

    • 这个解决方案永远不会起作用(current.equalsIgnoreCase 不存在)
    • equalsIgnoreCase 是 String 中的一个方法,它的目的是在检查之前获取当前的名称。编辑以反映这一变化
    【解决方案3】:

    块引用

    枚举是类,应该遵循类的约定。枚举的实例是常量,应该遵循常量的约定。

    块引用

    可以在以下链接中找到有关此的详细信息

    Coding Conventions - Naming Enums 希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多