期待您的帮助!我正在做一个java项目,再现徽标语言和我上限,因为我找不到一个优雅的,不太复杂的方式来切换不同的规则/指令,该项目侧重于高级编程和使用流()的建议;谓词();函数();这是我已经实现的指令列表,但我不知道如何分支它们,我把它们作为字符串:
- 向前(int);
- 向后(int);
- 左(int);
- 正确(int);
- CLEARSCREEN;
- 家;
- PENUP;
- PENDOWN; SETPENCOLOR (int) (int) (int);
- SETFILLCOLOR (int) (int) (int);
- SETSCREENCOLOR (int) (int) (int);
- SETPENSIZE (int);
- 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[]
。
希望这至少能给你一些想法,让你摆脱困境。