【问题标题】:Adapt variable arguments in Java to fixed argument in Java将 Java 中的可变参数改编为 Java 中的固定参数
【发布时间】: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 中,变量 argsArray 是相同的。由于组合空间太大,无法遍历args中的每个元素找到匹配的方法run


需要一个接受可变参数的 API,说:

     Object execute(Object... args)

然后我为许多指定类型的情况提供了一些优化版本的实现,当 args.

【问题讨论】:

  • 但它怎么知道你想要哪种方法??
  • 这感觉就像一个糟糕的设计。你为什么要这样做?
  • 如果你想要命名参数,切换到objective C,或者传递一个hash map。随心所欲地重载是自找麻烦。
  • 看起来您正在尝试实现“动态调度”或“多次调度”。有很多方法可以优化这一点,每种方法都有其缺点和优点。如果我是你,我会开始使用详尽的搜索使其工作,编写一组好的测试用例,然后。尝试使用各种树结构、间接表等对其进行优化
  • 为什么? Java 语言(编译器)将为您选择合适的方法。它被称为method overloading。您只需将它们全部以相同的名称公开即可。

标签: java arrays overloading variadic-functions dynamic-dispatch


【解决方案1】:

最简单的方法是使用反射迭代所有run 方法,并寻找参数类型的精确匹配。

如果您还需要支持近似匹配,其中应用了 Java 强制或一些扩展转换,那么它会有点复杂,但仍然可行。

一旦一切正常,您就完成了,除非分析器说您在 this 代码中存在性能问题,在这种情况下,您可能会尝试优化非顺序搜索算法。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2014-11-28
    • 2011-07-31
    相关资源
    最近更新 更多