在JDK 1.7之前切换字符串

时间:2016-02-18 10:11:38

标签: java enums switch-statement

我知道通过应用Enum可以解决此问题。但我发现它有一些局限性。

public void foo(String str) {
    Color color = Color.valueOf(str);
    switch (color) {
    case Green: /*do some stuff*/; break;
    case Red:   /*do some stuff*/; break;
    case Yellow:/*do some stuff*/; break;
    }
    //goes on
}
public enum Color{
    Green, Red, Yellow;
}
  1. 我怎么能以某种方式让valueOf(str)忽略大小写?
  2. 如果输入str与任何枚举元素不匹配,如何定义默认行为?显然,在switch语句中添加default子句不是解决方案。
  3. 我怎样才能以干净的方式完成所有这些?
  4. 修改 所以第一个问题是根据RealSkeptic的有用评论解决的。我想现在我可以使用str.toUpperCase()。第二个问题怎么样?

    修改 所以,根据aro_tech,对于第二个问题,我只需要添加另一个名为UNDEFINED的枚举元素,然后为它添加case子句。

    public void foo(String str) {
        Color color = Color.fromString(str);
        switch (color) {
        case GREEN: /*do some stuff*/; break;
        case RED:   /*do some stuff*/; break;
        case YELLOW:/*do some stuff*/; break;
        case UNDEFINED:/*default behavior*/; break;
        }
        //goes on
    }
    
       public enum Color{
            GREEN, RED, YELLOW, UNDEFINED;
            public static Color fromString(String stringName) {
                for(Color col : Color.values()) {
                    if(col.name().equalsIgnoreCase(stringName)) {
                        return col;
                    }
                }
                return UNDEFINED;
            }
        }
    

1 个答案:

答案 0 :(得分:2)

您可以更改枚举代码并为其提供静态工厂/查找方法:

public enum Color{
    Green, Red, Yellow;
    public static Color fromString(String stringName) {
        for(Color col : Color.values()) {
            if(col.name().equalsIgnoreCase(stringName)) {
                return col;
            }
        }

        return null;
    }
}

然后更改主方法的第一行:

Color color = Color.fromString(str);

当然,您可能需要处理null的特殊情况(与任何枚举条目不匹配的字符串)。