您好我试图制作一个用户可以输入不同命令的java程序,这个类可以识别所有命令,并根据它调用3-4个不同类的方法。目前,对于每个命令,我都有不同的if语句:
if (input.equals("change category FOOD"){...}
if (input.equals("Sort by price FOOD"){...}
if (input.equals("logout"){...}
有很多命令,我想知道是否有办法缩短它。
答案 0 :(得分:0)
使用带字符串的switch语句会自动实现string.equals方法:
switch(input) {
case "change category FOOD":
statement;
break;
case "Sort by price FOOD":
statement;
break;
case "logout":
statement;
break;
default:
statement;
}
“声明”代表您在问题中提出的{...}。
当你的if / else语句开始堆积时,这是一个不错的选择。不要忘记添加default:
案例。在没有任何案例得到满足的情况下,它作为最终的“其他”陈述。
答案 1 :(得分:0)
扩展@Jim Garrison的评论,
使用Map,其中第一个类型是字符串,表示命令,第二个类型是您可以运行的类。如果您不需要任何命令,则使用Runnable,并为每个命令编写Runnable实现,并在setup函数中创建映射条目。
如果您需要更多信息,请创建具有onCommand(...)方法的n接口SomeInterface,并传递必要的数据。再次,为每个命令添加一个实现,并将命令的每个映射添加到命令运行器到映射。因此,运行正确的命令实现只是
map.get("命令&#34)。按需(...);
答案 2 :(得分:0)
答案 3 :(得分:0)
其他答案建议使用map
,这当然是可行的。然而,它有几个潜在的缺点:
equals
以匹配命令与行动封装一组命令的另一种可能方法是使用带有runnable变量的enum
。例如:
public enum Command {
CHANGE_CATEGORY("change category", () -> {
// change category
}),
SORT_BY_PRICE("sort by price", () -> {
// sort by price
}),
...
DEFAULT("", () -> {
// default action
});
private final String commandText;
private final Runnable action;
Command(String commandText, Runnable action) {
this.commandText = commandText;
this.action = action;
}
public static void run(String text) {
Arrays.stream(values())
.filter(c -> c.commandText.equals(text))
.findAny().orElse(DEFAULT)
.action.run();
}
}
用作:Command.run(text)
这允许您将与命令关联的所有逻辑放在一个位置,并通过更改过滤器轻松更改匹配文本的逻辑(例如,忽略空格,大小写)。这个枚举也是一个单例,但语言正在处理何时初始化它的所有复杂性。
答案 4 :(得分:-1)
嗯,首先,每次你处理输入时,你都会检查每个if语句。使用if / else if来保持代码更清晰,更高效
if (input.equals("Hi") {
...
}
else if (input.equals("Hi") {
...
}
等等。
您还要求输入与半长字符串完全匹配。这几乎从未在实践中发生,您应该要求更短的参数,使用
将字符串拆分为数组String newString = string.split(" ");
最后,尽量保持代码尽可能干净。您可能无法缩短支票,因此只需保持代码可读性,不要将大量代码放在一个地方。