由于看起来您的函数不需要返回任何值,因此可以将每个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