应用程序
我正在编写一个根据用户输入执行某些功能的应用程序。 例如。如果用户输入是 “1 2 add”输出将为“3”。 我的目标是实现许多这样的方法(div、modulo 等)。当我的扫描仪识别出像“add”这样的函数名称时,应该调用函数“add()”。
我的方式
我的方法是让 FunctionHandler 类评估输入。
主要:
String inputCommand = sc.nextCommand();
functionHandler.handle(inputCommand);
函数处理程序:
public class FunctionHandler {
public void handle (String functionName) {
if (functionName.equals("add")) {
add();
} else if (functionName.equals("div") {
div();
}
}
private void add() {
.......
}
....
}
问题所在
随着我添加越来越多的函数,if 语句变得非常大,当然还有 FunctionHandler 类。另外,每当我添加一个新函数时,我都必须在两个地方更改代码:我必须定义该函数,然后在handle() 中添加 else if 子句来调用该函数。这意味着应该封装的两条信息被完全独立地“存储”。 我想知道解决这种情况的最佳做法是什么?
我的想法
我正在考虑使用枚举,但它们似乎不太适合这种情况。
我的另一个想法是创建一个接口(interface)Function,然后为每个实现Function的函数创建一个类。该接口(interface)有两种方法:
然后我可以在 FunctionHandler 中(手动)创建一个 Functions 数组,通过该数组我可以循环查看用户输入的命令是否与 getName() 匹配。 然而,为每个函数使用不同的类也不是很干净,而且它也没有摆脱这样的问题:对于我添加的每个函数,我必须在两个地方执行它:类和数组。
这个问题只是为了找出如何彻底解决这个问题。正确方向的指针将不胜感激!
非常感谢!
最佳答案
另一个选择是保留处理程序的Map
。如果您使用的是 Java 8,它们甚至可以是方法引用。
// InputType and ResultType are types you define
Map<String, Function<InputType, ResultType>> operations = new HashMap<>();
operations.put("add", MathClass::add);
// ...
ResultType result = operations.get(userInput).apply(inputObject);
这样做的一个缺点是所有操作的输入和输出类型必须相同。
关于java - 用于指定调用哪个函数的字符串输入 [Java] [最佳实践],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31255560/