2012-08-31 47 views
1

我有一個類定義了5個函數。在另一個類中,我有一個多重循環結構,它試圖計算我在包含許多字符串的輸入文件上每個上述函數所花費的時間。Java動態更改循環中的函數名稱

我希望輸出使得對於輸入文件的每個條目,計算並打印出每個函數在10個調用中所花費的平均時間。所以,輸出應該像 -

inputString | function1AvgTime | f2AvgTime等。

我找不出一個優雅的方法來調用所有這些5個函數10次,每個單個輸入字符串。現在,我似乎做的是這個 -

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

是否有存儲在一個數組或數據結構的一些函數名,和一個迭代循環中調用他們的方法嗎?無論如何,我的工作已經完成。我只是好奇,如果有更好的設計。

回答

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遍佈全球的關鍵接口。我相信,同時它通常只會執行一次。所以,您需要確保它可以多次運行!

但到目前爲止,你已經獲得了不多了明確for循環,除了存儲Runnable個集合中的能力:

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

如果你想避免寫Runnable s ^自己,可以使用Java反射來獲取String名稱的方法,或者甚至通過全面自省。基本上,你會寫一個Runnable執行一個java.lang.reflect.Method。可運行的方法更爲靈活一點,因爲你也可以做的事情,如:

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

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

運行相同功能具有不同的參數。

+0

聽起來不錯!讓我試試這個,然後回來。謝謝! – sneha

+0

對Runnable的建議+1,好於我的回答(我將刪除)。不過,我會重申我對任何基於反射的解決方案的厭惡。 –

+0

這就是爲什麼我在那裏強調'String'的原因。本質上使用反射意味着通過字符串而不是字節碼來引用方法。爲什麼我在參數中添加了示例(並將參數傳遞給通過反射獲得的方法非常混亂)。 –

4

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

它允許你檢查一個班級的成員,並打電話給你想要的。特別是,請查看上面鏈接中的「按名稱調用方法」部分。

+0

這是圍繞我想要的地方。 – sneha

+0

我永遠不會使用反射「優雅」,心靈呼喚。 –

+0

我同意 - 我總是用單眼斜視和不好的直覺寫反射代碼。編寫一些基本的自動化測試不需要您編寫boileplate會很有用。那麼 - 文字回答「數組中的函數名稱還是某些數據結構,並在單個迭代循環中調用它們?」 - 反射。 「好奇,如果有更好的設計」 - Runnable。因爲這些原因,我會+1 @ Anony-Mousse的回答;) – mtsvetkov