在 JDK 1.7 之前打开字符串

Switch on String before JDK 1.7

我知道可以通过应用 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. 我怎样才能以干净的方式完成所有这些?

编辑: 所以第一个问题是根据 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;
        }
    }

您可以更改枚举代码并为其提供静态 factory/lookup 方法:

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 的特殊情况(与任何枚举条目都不匹配的字符串)。