【发布时间】:2015-10-20 01:02:06
【问题描述】:
我有一个适配器,旨在将变量参数的调用转换为指定的方法目标。示例代码如下所示。
class Adapter {
public Object execute(Object... args){
run(args);
//run2(args[0], args[1]);
//run3(args[0], args[1]);
}
private int run(int c, int d){
return c+d;
}
private int run(int a, float b){
return 0;
}
private String run(Integer a, String b){
return "ss";
}
private Object run(Object c, float m, int q){
return new Object();
}
..........
}
execute() 方法接受可变参数。根据args 中的元素,Adapter 会选择一个runX 中具有一致methodtype 的函数来执行。例如,如果 args 中的前两个元素都是 int,则将选择 run1。匹配规则为:
args:{1,2} => run(int, int)
args:{new Integer(3), "asdas"} => run(Integer, String)
args:{new Object(), 4.0, 5} => run(Object, float, int)
.......
在方法execute中有没有很好的方法来做这个调用转换?在 Java 中,变量 args 和 Array 是相同的。由于组合空间太大,无法遍历args中的每个元素找到匹配的方法run。
需要一个接受可变参数的 API,说:
Object execute(Object... args)
然后我为许多指定类型的情况提供了一些优化版本的实现,当 args.
【问题讨论】:
-
但它怎么知道你想要哪种方法??
-
这感觉就像一个糟糕的设计。你为什么要这样做?
-
如果你想要命名参数,切换到objective C,或者传递一个hash map。随心所欲地重载是自找麻烦。
-
看起来您正在尝试实现“动态调度”或“多次调度”。有很多方法可以优化这一点,每种方法都有其缺点和优点。如果我是你,我会开始使用详尽的搜索使其工作,编写一组好的测试用例,然后。尝试使用各种树结构、间接表等对其进行优化
-
为什么? Java 语言(编译器)将为您选择合适的方法。它被称为method overloading。您只需将它们全部以相同的名称公开即可。
标签: java arrays overloading variadic-functions dynamic-dispatch