由於看起來您的函數不需要返回任何值,因此可以將每個ID密鑰與調用所需方法的Runnable
對象相關聯。例如:
Map<Integer, Runnable> map = ...;
map.put(0, new Runnable() {
public void run() {
doSomeFunction();
}
});
map.get(0).run();
如果您需要的方法能夠返回一個值,你可以使用Callable
,而不是Runnable
。您也可以創建自己的類似界面,並在需要時使用它。
目前在Java中,這種事情必須通過一個類的實例來完成,例如Runnable
。 Java 7或8(取決於他們如何決定繼續)將添加lambda表達式和方法引用,我認爲這是您真正想要的。方法引用可以讓你做這樣的事情(使用Map<Integer, Runnable>
就像上面一樣)。
map.put(0, Foo#doSomeFunction());
編輯:
你的更新顯示,其中一些方法需要有傳遞給它們的參數。但是,你似乎在尋求兩種不同的東西。在你的聲明中指定
0 -> doSomeFunction(argument);
1 -> doSomeOtherFunction();
2 -> doStuff(arg2);
參數的映射,這表明它們是可在任何時間值的例子中,你聲明的映射或他們是在課堂或一些這樣的領域。
new Runnable() {
public void run() {
doSomeFunction(argument);
}
}
這裏,argument
要麼需要一個字段或聲明final
:在任何情況下,當你創建Runnable
你可以申報。
另一方面,如果在創建映射時沒有對參數的引用,則必須創建一個可供所有方法調用共享的一致接口。例如,可以爲您的樣品工作,最不常見的接口將是一個定義了兩個參數,一個void
回報:
public interface CustomRunnable<T,G> {
public void run(T arg1, G arg2);
}
然後你可以有:
map.put(0, new CustomRunnable<Foo,Bar>() {
public void run(Foo arg1, Bar arg2) {
doSomeFunction(arg1);
}
});
map.put(1, new CustomRunnable<Foo,Bar>() {
public void run(Foo arg1, Bar arg2) {
doSomeOtherFunction();
}
});
map.put(2, new CustomRunnable<Foo,Bar>() {
public void run(Foo arg1, Bar arg2) {
doStuff(arg2);
}
});
每個CustomRunnable
只使用arguments它需要,如果有的話。那麼你可以這樣做:
map.get(item.id).run(argument, arg2);
顯然,這是越來越醜,但它幾乎是你在這種情況下必須做的。
+1爲有趣的例子,並注意到Java 7/8中可能的Lambdas。 – MyNameIsZero 2010-09-16 00:37:49