在 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;
}
- 我怎样才能让
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;
}
}
您可以更改枚举代码并为其提供静态 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 的特殊情况(与任何枚举条目都不匹配的字符串)。
我知道可以通过应用 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;
}
}
您可以更改枚举代码并为其提供静态 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 的特殊情况(与任何枚举条目都不匹配的字符串)。