【发布时间】: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;
}
- 我怎样才能让
valueOf(str)忽略大小写? - 当输入
str不匹配任何枚举元素时,如何定义默认行为?显然,在 switch 语句中添加默认子句不是解决方案。 - 我怎样才能以干净的方式完成所有这些工作?
编辑:
因此,根据 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