【发布时间】:2011-06-08 19:08:46
【问题描述】:
可能重复:
What's the nearest substitute for a function pointer in Java?
我只是有一种情况,如果有类似函数指针的功能,就像你可能在 c 或 c++ 中使用的那样,那就太好了。我能想到的最好的事情是结合 Runnables 并在不同的线程中启动它们。有什么建议吗?
【问题讨论】:
可能重复:
What's the nearest substitute for a function pointer in Java?
我只是有一种情况,如果有类似函数指针的功能,就像你可能在 c 或 c++ 中使用的那样,那就太好了。我能想到的最好的事情是结合 Runnables 并在不同的线程中启动它们。有什么建议吗?
【问题讨论】:
在他们为 java 添加闭包之前,这件事似乎最接近java.lang.reflect.Method。例如Method method = SomeClass.getMethod("methodName", methodParameterTypes)
然后你可以传递method(就像一个函数指针)并在它上面调用invoke(..),传递一个对象(或者null,如果是静态的)
但这不是一个很好的做法。您可以定义一个接口,或者使用现有的Runnable / Callable,内联实现它,然后传递实例。
【讨论】:
使用Functors,也就是函数对象。
Java 没有一流的函数,所以 函数对象通常表示 通过具有单一方法的接口 (最常见的是 Callable 接口),通常与 实现是匿名的 内部类。
【讨论】:
您可能正在寻找command pattern,它本质上定义了一个带有一种方法的接口(比如execute())和为不同操作实现此方法的类。您可以使用对这些类实例的引用,有点像 C++ 中的函数指针。这种模式通常用于实现解释器。
【讨论】:
如 Bozho 的回答中所述,一个选项是使用 java.lang.reflect.Method。它非常灵活,但主要缺点是您失去了所有类型安全性 - 没有检查您是否使用正确的参数调用方法(并期望正确的返回类型)。
因此,如果您稍后更改方法,而忘记更改所有调用者,您只会在运行时发现(通过ClassCastException)。甚至方法名称也只在运行时检查(因为您按名称获取它。
另一种方法是通过接口使用回调。想要接受另一个方法作为参数的方法只需要某个接口的实例。该接口只有一种方法,doStuff。然后,您可以创建实现接口的实例,并将这些实例传递给方法。这有点冗长(因为您需要接口),但类型安全,因此更容易重构。
这或多或少是command pattern,顺便说一句。
【讨论】:
回调是一种实现类似 C++ 中函数指针的方法。
此外,它们是类型安全的(与可能不是的函数指针不同)。
【讨论】: