我知道通过应用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;
}
valueOf(str)
忽略大小写?str
与任何枚举元素不匹配,如何定义默认行为?显然,在switch语句中添加default子句不是解决方案。 修改
所以第一个问题是根据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;
}
}
答案 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的特殊情况(与任何枚举条目不匹配的字符串)。