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)的问题是用户希望为具有描述性名称的函数分配,例如addUserHandler()用于"addUSer"动作.
如果Java有代理或函数指针,我只需在字符串(表示操作)和委托(在程序中实际执行操作)之间创建一个Map.我想我可以使用Reflection来模拟委托,但它是血腥的,我失去了类型安全性,因为我必须为类和方法使用String名称.有没有更好的方法?
谢谢,
如果您希望用户获得自动类型转换(例如从字符串到整数),那么反射是唯一的方法.如果你让用户完成工作,那么你不需要反射(并且你得到类型安全):
你的命令界面:
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)
| 归档时间: |
|
| 查看次数: |
1332 次 |
| 最近记录: |