Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 打开JDK1.7之前的字符串_Java_Enums_Switch Statement - Fatal编程技术网

Java 打开JDK1.7之前的字符串

Java 打开JDK1.7之前的字符串,java,enums,switch-statement,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;

我知道通过应用
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
}

  • 我怎样才能使(str)的
    值忽略大小写
  • 当输入
    str
    与任何枚举元素不匹配时,如何定义默认行为?显然,在switch语句中添加default子句不是解决方案
  • 我怎样才能以干净的方式完成所有这些
  • 编辑: 因此,根据Real怀疑论者的有益评论,第一个问题得到了解决。我想现在我可以使用
    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;
        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(一个与任何枚举项都不匹配的字符串)的特殊情况。

    Java语言约定要求常量名称必须全部大写。如果遵循这些约定,在应用
    valueOf
    之前,很容易将任何字符串转换为大写。问题3非常主观,可能取决于“做一些事情”的真正含义。对于复杂的“东西”,开关不是很干净,可能只能在工厂方法中使用,这些方法选择正确的对象来完成“东西”。一个可能对您有用的巧妙技巧是完全消除开关(保留
    fromString
    方法),并将“dosomething”添加到枚举本身的方法中。因此,您可以调用类似于
    color.dosomething(param1,param2)的东西
    。对于问题2,您可以将
    Undefined
    添加到枚举中,
    fromString
    可以返回
    Undefined
    ,而不是
    null
    。如果我是用户,我会将其保留为null,只需在开关中添加一个“默认”大小写即可。@aro_tech就是这样!非常感谢。
    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);