java - Java 中的委托(delegate)映射

标签 java delegates callback function-pointers

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

> action [object_1, [object_2, [... object_n] ... ]]

例如:

> addUser name "John Doe" age 42

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

action 之后的所有内容都是object(即,action 使用对象)。您可以看到操作和对象是简单的字符串。如果需要,还可以将对象字符串转换为数字。

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

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

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

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

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

(1) 的问题在于,我的库的用户可能会决定实现任意数量的功能,以实现他想要支持的任意数量的操作。 (2) 的问题在于,用户可能希望分配具有描述性名称的函数,例如用于“addUSer”操作的 addUserHandler()。

如果 Java 有委托(delegate)或函数指针,我会在字符串(委托(delegate) Action )和委托(delegate)(用于在程序中实际执行 Action )之间创建一个映射。我想我可以用反射来模拟委托(delegate),但这很糟糕,而且我失去了类型安全性,因为我必须为类和方法使用字符串名称。有没有更好的办法?

谢谢,

最佳答案

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

你的命令界面:

public interface MyCommand {
  public void execute(String[] args);
}

一个实现:

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]));
      }});
  }
}

关于java - Java 中的委托(delegate)映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1526098/

相关文章:

java - 在 Spring Integration 中的消息 header 中设置文件名

java - future 和 promise 有什么区别?

ios - 设置 UIAlertView 委托(delegate)

c++ - 以方便的方式在 C++ 中使用方法作为回调

c# - Func<MyType> 隐式转换为 MyType

android - 只有在另一个类中完成使用 Parse.com 的异步数据导入后,才在 Android 中填充 ListView

java - EJB和preparedStatement?

java - JEP 295 AOT : Objects compiled multiple times

ios - 当 self 等于 NSObject 时委托(delegate)丢失

c# - 解决编译时函数不正确的BUG?