我开始设计一个Android应用程序,我需要不断监听新命令,并根据收到的命令执行不同的操作。
所以让我们看一个我想尽可能避免的例子:
Public void onCommandReceived(String command)
{
Switch (command)
{
Case A:
DoActionA();
break;
...
Case Z:
DoActionZ();
break;
}
}
编辑:
我将收到一个长字符串,我将不得不解析字符串以获取命令。
这个问题有没有更好的实现?
非常感谢
答案 0 :(得分:0)
在某些时候,你需要有一个类似switch (command)
示例的结构,至少为了将用户输入或程序事件转换为命令,而简单的switch语句是这个逻辑的一个很好的选择。还有其他选择,但是switch语句很清楚,每个人都知道它的含义。
以下是一些替代方案,根据您的设计细节可能会有用:
您可以预先填充Map<>
或类似的命令映射到操作,如下所示:
Map<Command, Action> decisionTable = new HashMap<>();
decisionTable.put(A, new DoActionA());
decisionTable.put(B, new DoActionB());
这将在某处初始化,然后像这样调用:
Public void onCommandReceived(String command)
{
decisionTable.get(command).action();
}
我遗漏了详细信息,例如当操作不存在时的错误处理,Action
接口以及实现每个操作的各个类。
如果为每个动作创建一个单独的类,如上所述,适合您的设计,那么不要将“哑”命令传递给您的函数,而是传递一个接口实例。这与上面的决策表完全一样,除了Command
是带有接口和子类的那个 - 你不需要进行切换,因为命令/动作子类已经为你提供了这个逻辑,例如:
interface Command {
void action();
}
class CommandA {
@Override
void action() {
// do something
}
}
...
Public void onCommandReceived(Command command)
{
command.action();
}
如果您需要根据代码中多个点的命令做出不同的决定,您甚至可能想要像双重调度那样花哨的东西,我不会在这里讨论。
但是,如果这是您的代码中唯一根据命令类型做出决定的速度,那么switch
语句并不聪明或棘手,这使得它恰好就是您的代码类型想要在6个月之后看一下 - 你和其他人都会完全理解它,不应低估它的价值。
答案 1 :(得分:-1)
可能这就是你要找的东西
case 1:
case 2:
case 3:
doSomthing();
break;
case 4:
doAnother();
break;
这样可行,因为案例1和案例2没有中断陈述,将落入案例三。