java - 用于指定调用哪个函数的字符串输入 [Java] [最佳实践]

标签 java string function user-input

应用程序

我正在编写一个根据用户输入执行某些功能的应用程序。 例如。如果用户输入是 “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)有两种方法:

  • getName()
  • 执行()
  • 然后我可以在 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/

    相关文章:

    java - 如何在主 JFrame 表单的开头显示 JDialog?

    java - 字符串索引超出范围 : -1 error with loops

    Java 整数与字符串?

    javascript - 重复交通灯序列

    javascript - 对对象列表进行排序 javascript

    java - 关于java多线程的一些问题,

    java - 如何在Fragment上实现这些Activity代码呢?

    c# - String.Concat 、string.format 和 + 之间有什么区别?

    php - 如何从核心php中的两个变量中提取常用词

    Javascript:在特定时间段后调用函数