查看此代码 -
switch(kind) {
case "green" :
GreenKind.doSomething(); // Static function
break;
case "white" :
WhiteKind.doSomething(); // Static function
break;
case "blue" :
BlueKind.doSomething(); // Static function
break;
case "yellow" :
YellowKind.doSomething(); // Static function
break;
}
有一种方法可以避免switch语句吗?因为它闻起来很糟糕。
也许像这样的人? -
kinds.get(kind).doSomething();
我的解决方案的问题是功能是静态的,我无法实现具有静态功能的接口。如果你不明白为什么我编写接口,因为我想在上面的解决方案中使用多态。
答案 0 :(得分:15)
我会像enum
一样:
enum Kind {
GREEN {
@Override
public void doSomething() {
GreenKind.doSomething();
}
},
WHITE {
@Override
public void doSomething() {
WhiteKind.doSomething();
}
};
public abstract void doSomething();
}
传递枚举常量,例如这个方法:
public static void invoke(Kind kind) {
kind.doSomething();
}
并称之为:
invoke(Kind.GREEN);
这种方式看起来更干净,而且更安全,因为你只能有一组固定的输入。
答案 1 :(得分:3)
您可以使用枚举。单个条目枚举的示例:
public enum Kind
{
GREEN("green")
{
@Override
public void doSomething() { /* do something */ }
};
private final String asString;
public abstract void doSomething();
Kind(final String asString)
{
this.asString = asString;
}
@Override
public String toString() { return asString; }
}
在代码中,您将执行Kind.valueOf(kind.toUppercase()).doSomething();
。
这也可以让你通过一些工作摆脱{Green,Red} Kind:只需将所有逻辑放入枚举中。