如何以优雅的方式在不同的指令/规则之间切换



期待您的帮助!我正在做一个java项目,再现徽标语言和我上限,因为我找不到一个优雅的,不太复杂的方式来切换不同的规则/指令,该项目侧重于高级编程和使用流()的建议;谓词();函数();这是我已经实现的指令列表,但我不知道如何分支它们,我把它们作为字符串:

  1. 向前(int);
  2. 向后(int);
  3. 左(int);
  4. 正确(int);
  5. CLEARSCREEN;
  6. 家;
  7. PENUP;
  8. PENDOWN;
  9. SETPENCOLOR (int) (int) (int);
  10. SETFILLCOLOR (int) (int) (int);
  11. SETSCREENCOLOR (int) (int) (int);
  12. SETPENSIZE (int);
  13. RIPETI (int) [(cmd)];
    • 重复命令列表(cmd)中的命令序列

我想过if () else()或者switch(),但是看起来不是很优雅

如果切换可以工作,但您不希望方法有太多行,您可以尝试使用映射,从String到方法调用(可以使用lambdas),或者从Enum值到相同的值。

Map<String, Runnable> operations = Map.ofEntries(
Map.entry("FORWARD", () -> action.forward()),
Map.entry("BACKWARD", () -> action.backward(),
// . . .
);

Map<Instruction, Runnable> operations = Map.ofEntries(
Map.entry(Instruction.FORWARD, action::forward),
Map.entry(Instruction.BACKWARD, action::backward),
// . . .
);

请注意,在第二个示例中,我对Action对象的调用使用了方法引用,我假设此时您已经有了该对象的实例。

问题是,你的指令采用不同数量的参数,所以这实际上只是一个解决方案的草图。您必须弄清楚如何将其应用到您的用例中。特别是,您没有提到Action方法如何接受参数。我想每个函数都有0、1或多个参数,具体取决于指令。

你可以做的一件事是将每个命令解析为该命令的Enum实例,并将任何参数解析为单独的对象;可能是List<Integer>。我不知道你是否可以修改Action类来接受那个列表而不是单个参数。或者可以将其修改为例如forward(int... params),然后您可以传递参数的int[]

希望这至少能给你一些想法,让你摆脱困境。

相关内容

  • 没有找到相关文章

最新更新