我正在尝试为交互式 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) 的问题在于,用户可能希望分配具有描述性名称的函数,例如用于“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/