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
与任何枚举元素不匹配时,如何定义默认行为?显然,在switch语句中添加default子句不是解决方案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);