【问题标题】:Switch on String before JDK 1.7在 JDK 1.7 之前开启 String
【发布时间】:2016-02-18 10:11:38
【问题描述】:

我知道通过应用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 语句中添加默认子句不是解决方案。
  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;
        }
    }

【问题讨论】:

  • Java 语言约定要求常量名使用 ALL_CAPS。如果您遵守这些约定,那么在应用valueOf 之前将任何字符串转换为大写都很容易。
  • 问题 3 非常主观,可能取决于“做一些事情”的真正含义。对于复杂的“东西”,开关不是很干净,可能只应该用在工厂方法中,选择合适的对象来做“东西”。一个可能对您有用的巧妙技巧是完全消除开关(保留fromString 方法)并将“做一些事情”添加到枚举本身的方法中。所以你打电话给color.doSomeStuff(param1, param2);

标签: java enums switch-statement


【解决方案1】:

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

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;
    }
}

然后改变你的 main 方法的第一行:

Color color = Color.fromString(str);

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

【讨论】:

  • 对于问题 2,您可以将 Undefined 添加到枚举中,fromString 可以返回 Undefined 而不是 null
  • 如果我是用户,我会将其保留为 null,并在开关中添加一个“默认”大小写。
  • @aro_tech 就是这样!谢谢。
猜你喜欢
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多