【问题标题】:What is the cloest thing to a function pointer in java? [duplicate]java中最接近函数指针的东西是什么? [复制]
【发布时间】:2011-06-08 19:08:46
【问题描述】:

可能重复:
What's the nearest substitute for a function pointer in Java?

我只是有一种情况,如果有类似函数指针的功能,就像你可能在 c 或 c++ 中使用的那样,那就太好了。我能想到的最好的事情是结合 Runnables 并在不同的线程中启动它们。有什么建议吗?

【问题讨论】:

标签: java function-pointers


【解决方案1】:

在他们为 java 添加闭包之前,这件事似乎最接近java.lang.reflect.Method。例如Method method = SomeClass.getMethod("methodName", methodParameterTypes)

然后你可以传递method(就像一个函数指针)并在它上面调用invoke(..),传递一个对象(或者null,如果是静态的)

但这不是一个很好的做法。您可以定义一个接口,或者使用现有的Runnable / Callable,内联实现它,然后传递实例。

【讨论】:

  • 应该可以胜任这项工作。谢谢!
【解决方案2】:

使用Functors,也就是函数对象。

Java 没有一流的函数,所以 函数对象通常表示 通过具有单一方法的接口 (最常见的是 Callable 接口),通常与 实现是匿名的 内部类。

【讨论】:

    【解决方案3】:

    您可能正在寻找command pattern,它本质上定义了一个带有一种方法的接口(比如execute())和为不同操作实现此方法的类。您可以使用对这些类实例的引用,有点像 C++ 中的函数指针。这种模式通常用于实现解释器。

    【讨论】:

      【解决方案4】:

      如 Bozho 的回答中所述,一个选项是使用 java.lang.reflect.Method。它非常灵活,但主要缺点是您失去了所有类型安全性 - 没有检查您是否使用正确的参数调用方法(并期望正确的返回类型)。

      因此,如果您稍后更改方法,而忘记更改所有调用者,您只会在运行时发现(通过ClassCastException)。甚至方法名称也只在运行时检查(因为您按名称获取它。

      另一种方法是通过接口使用回调。想要接受另一个方法作为参数的方法只需要某个接口的实例。该接口只有一种方法,doStuff。然后,您可以创建实现接口的实例,并将这些实例传递给方法。这有点冗长(因为您需要接口),但类型安全,因此更容易重构。

      这或多或少是command pattern,顺便说一句。

      【讨论】:

      • 真的是命令模式吗?我认为它更接近于战略。
      • 是的,很可能。我认为两者都非常相似,无论如何,两者都可能在 Java 中以类似方式实现。
      【解决方案5】:

      回调是一种实现类似 C++ 中函数指针的方法。
      此外,它们是类型安全的(与可能不是的函数指针不同)。

      【讨论】:

        猜你喜欢
        • 2010-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-15
        • 2011-08-28
        • 2020-08-13
        • 2013-08-12
        相关资源
        最近更新 更多