一尘不染

相当于Python中函数映射的Java

java

在python中,如果我有一些要基于输入调用的函数,则可以执行以下操作:

lookup = {'function1':function1, 'function2':function2, 'function3':function3}
lookup[input]()

那就是我有一个映射到函数的函数名字典,并通过字典查找来调用函数。

如何在Java中执行此操作?


阅读 308

收藏
2020-12-03

共1个答案

一尘不染

有几种方法可以解决此问题。其中大多数已发布:

  • 命令 -在地图中保留一堆具有execute()或invoke()方法的对象;通过名称查找命令,然后调用方法。
  • 多态性 -比命令更一般的说,您可以在任何相关对象集上调用方法。
  • 最后是反射-您可以使用反射获取对java.lang.Method对象的引用。对于一组已知的类/方法,此方法效果很好,并且在加载Method对象后不会有太多开销。例如,您可以使用它来允许用户在命令行中键入Java代码,并实时执行。

我个人将使用Command方法。命令与模板方法很好地结合在一起,使您可以在所有命令对象上强制执行某些模式。例:

public abstract class Command {
  public final Object execute(Map<String, Object> args) {
    // do permission checking here or transaction management
    Object retval = doExecute(args);
    // do logging, cleanup, caching, etc here
    return retval;
  }
  // subclasses override this to do the real work
  protected abstract Object doExecute(Map<String, Object> args);
}

仅当您需要对那些您无法控制其设计,并且对于它们执行命令并不实际的类使用这种映射时,我才求助于反射。例如,您无法通过为每种方法创建命令来在命令外壳中公开Java
API。

2020-12-03