1

我在一个类中定义了 5 个函数。在另一个类中,我有一个多循环结构,它尝试计算上述每个函数在包含许多字符串的输入文件上所花费的时间。

我希望输出使得对于输入文件的每个条目,计算并打印出每个函数超过 10 次调用所花费的平均时间。所以,输出应该是 -

输入字符串 | 函数1平均时间 | f2AvgTime 等等。

我想不出一种优雅的方式来为单个输入字符串调用所有这 5 个函数 10 次。现在我似乎在做的是这个 -

    for (inputString):
         for (iteration 1 to 10):
             call function 1
         for (iteration 1 to 10):
             call function2
    and so on....

有没有办法将函数名称存储在数组或某些数据结构中,并在单个迭代循环中调用它们?反正我的工作已经完成了。我只是好奇是否有更好的设计。

4

2 回答 2

4

使用Runnable界面,

void runMultipleTimes(Runnable run, int times) {
    for (int i = 0; i < times; i++) {
        run.run();
    }
}

然后使用匿名本地类来包装各个函数,即

runMultipleTimes(new Runnable() {
    @Override
    void run() {
        function1();
    }
}, 10 /* how often to run */);

这在某种程度上符合 Java API。Runnable是 Java 到处使用的关键接口。同时,我相信它通常只执行一次。因此,您可以确保它可以多次运行!

但是到目前为止,除了将s 存储在集合中for的能力之外,您对显式循环的收获并不多:Runnable

for (Runnable run : runCollection) {
    runMultipleTimes(run, 100);
}

如果您想避免Runnable自己编写 s,可以使用 Java 反射按String名称获取方法,甚至通过完全自省。本质上,您将编写一个 Runnable执行 one的程序java.lang.reflect.Method。Runnable 方法更灵活一些,因为您还可以执行以下操作:

runCollection.add(new Runnable() {
    @Override
    void run() {
        function(123456);
    }
});

runCollection.add(new Runnable() {
    @Override
    void run() {
        function(654321);
    }
});

使用不同的参数运行相同的函数。

于 2012-08-31T07:44:24.880 回答
4

您可能想查看反射:http: //java.sun.com/developer/technicalArticles/ALT/Reflection/

它允许您检查类的成员并调用您想要的成员。特别是,请查看上面链接中的“按名称调用方法”部分。

于 2012-08-31T07:30:35.400 回答