Java 中 if 语句的长列表

2022-08-31 10:13:05

对不起,我找不到一个问题来回答这个问题,我几乎可以肯定其他人以前提出过这个问题。

我的问题是我正在编写一些系统库来运行嵌入式设备。我有命令可以通过无线电广播发送到这些设备。这只能通过文本来完成。在系统库中,我有一个线程来处理看起来像这样的命令

if (value.equals("A")) { doCommandA() }
else if (value.equals("B")) { doCommandB() } 
else if etc. 

问题是,有很多命令会迅速螺旋式上升到失控的东西。看起来很可怕,调试很痛苦,几个月后就很难理解。


答案 1

使用命令模式

public interface Command {
     void exec();
}

public class CommandA() implements Command {

     void exec() {
          // ... 
     }
}

// etc etc

然后构建一个对象并用实例填充它:Map<String,Command>Command

commandMap.put("A", new CommandA());
commandMap.put("B", new CommandB());

然后,您可以将 if/else if 链替换为:

commandMap.get(value).exec();

编辑

您还可以添加特殊命令,例如 或 ,但您需要 处理这些极端情况的 命令,以最大限度地减少客户端的检查。UnknownCommandNullCommandCommandMap


答案 2

我的建议是枚举和命令对象的轻量级组合。这是Joshua Bloch在有效Java的第30项中推荐的一个成语。

public enum Command{
  A{public void doCommand(){
      // Implementation for A
    }
  },
  B{public void doCommand(){
      // Implementation for B
    }
  },
  C{public void doCommand(){
      // Implementation for C
    }
  };
  public abstract void doCommand();
}

当然,您可以将参数传递给 doCommand 或具有返回类型。

如果 doCommand 的实现并不真正“适合”枚举类型,则此解决方案可能并不真正合适,这与通常必须进行权衡时一样有点模糊。


推荐