在这种情况下有什么办法可以避免条件结构吗?

Is there any way to avoid a conditional structure in this case?

我开始设计一个 Android 应用程序,我需要在其中持续侦听新命令并根据收到的命令执行不同的操作。

那么让我们看一个我希望尽可能避免的例子:

Public void onCommandReceived(String command)
{
     Switch (command)
     {
        Case A:
            DoActionA();
            break;

        ...

        Case Z:
            DoActionZ();
            break;
     }
}

编辑:

我会收到一个很长的字符串,我必须解析该字符串才能获取命令。

这个问题有更好的实现吗?

非常感谢

可能这就是您要找的东西

case 1:
case 2:
case 3:
    doSomthing();
    break;
case 4:
    doAnother();
    break;

这会起作用,因为案例 1 和案例 2 没有 break 语句,将落入案例三。

在某些时候,您需要有一个类似于您的 switch (command) 示例的结构,至少为了将用户输入或程序事件转换为命令,而不起眼的 switch 语句是这种逻辑的不错选择。有替代方案,但 switch 语句很清楚,每个人都立即知道它的含义。

这里有一些备选方案,根据您的设计细节可能会有用:

决定table

您可以 pre-populate 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 界面以及实现每个操作的各个 classes。

虚拟调度

如果像上面那样为每个操作创建一个单独的 class 适合您的设计,那么不要将 "dumb" 命令传递给您的函数,而是传递一个接口实例。这与上面的决定 table 完全一样,除了 Command 是带有接口和 subclass 的那个——你不需要做转换,因为 command/action subclass 已经为您提供了该逻辑,例如:

interface Command {
    void action();
}

class CommandA {
    @Override
    void action() {
        // do something
    }
}

...

Public void onCommandReceived(Command command)
{
    command.action();
}

如果您需要在代码中的多个点根据哪个命令做出不同的决定,您甚至可能想要像双重分派这样花哨的东西,我不会去进入这里。

切换

但是,如果这是您的代码中唯一根据命令类型做出决定的步骤,那么 switch 语句既不聪明也不棘手,这恰恰是你想在 6 个月后查看的代码 - 你和其他人都会完全理解它,并且不应低估它的价值。