Java代表的地图

Ara*_*anu 4 java delegates function-pointers callback

我正在尝试为交互式Java程序创建一个非常简单的命令行库.您启动Java程序,它会提示您输入命令.语法是:

> action [object_1, [object_2, [... object_n] ... ]]
Run Code Online (Sandbox Code Playgroud)

例如:

> addUser name "John Doe" age 42
Run Code Online (Sandbox Code Playgroud)

在这里action = "addUser", object_1 = "name", object_2 = "John Doe", object_3 = "age", object_4 = "42".

之后的一切行动是一个对象(即,一个动作使用对象).您可以看到操作和对象是简单的字符串.如有必要,还可以将对象字符串转换为数字.

我的计划是这个命令行库的用户只需创建方法(属于任何合适的Java对象)并将每个方法分配给特定的操作.命令行中的对象成为用户分配方法的参数.实现上述示例的方法的合适类将是:

class Foo {
    public void addUserHandler(
            String param1, String param2, String param3, Integer param4) {
        do.someThing();
    }
}
Run Code Online (Sandbox Code Playgroud)

当用户键入命令时,程序员分配的相应函数将使用命令行中指定的参数进行调用.

我知道Java没有函数指针(如C)或委托(如C#),实现回调的方法是通过接口,但是,我不知道如何在这种情况下使用接口.我在界面上看到的问题是他们有:

  1. 要实现的固定数量的功能
  2. 要实现的功能具有固定的声明.

(1)的问题在于我的库的用户可能决定实现任意数量的功能,因为他想要支持许多动作.(2)的问题是用户希望为具有描述性名称的函数分配,例如addUserHandler()用于"addUSer"动作.

如果Java有代理或函数指针,我只需在字符串(表示操作)和委托(在程序中实际执行操作)之间创建一个Map.我想我可以使用Reflection来模拟委托,但它是血腥的,我失去了类型安全性,因为我必须为类和方法使用String名称.有没有更好的方法?

谢谢,

jam*_*mes 6

如果您希望用户获得自动类型转换(例如从字符串到整数),那么反射是唯一的方法.如果你让用户完成工作,那么你不需要反射(并且你得到类型安全):

你的命令界面:

public interface MyCommand {
  public void execute(String[] args);
}
Run Code Online (Sandbox Code Playgroud)

实施:

public class MyObj {
  public void doSomething(String param1, Integer param2) {
  }

  private void register() {
    mainApp.registerCommand("doSomething", new MyCommand() {
      @Override public void execute(String[] args) {
        doSomething(args[0], Integer.parseInt(args[1]));
      }});
  }
}
Run Code Online (Sandbox Code Playgroud)