没有函数指针,除了接口之外,在 Java 中实现回调的推荐方法是什么?

StackOverflow https://stackoverflow.com/questions/626669

  •  06-07-2019
  •  | 
  •  

我有几个类想要互相传递一些信息并稍后使用该信息(回调模式)进行回调。

在我的应用程序中,此机制有两个目的:

  • 预定/延迟执行
  • 涉及消息传递的异步执行

我的对象基本上互相说 “当你做完 X 后,给我回电话并告诉我用 Z 做 Y(因为那时我会忘记这件事)”. 。其中 X 可能只是等待正确的时间,但也与远程服务通信或调用本地函数。

现在,如果 Java 中有函数指针(或等效函数),我将实现一些“Job”类,其中包含一加上它所需的参数。例如,在 PHP 中,该结构必须存储类名、函数名和参数数组。在 C 中,它将是一个指向函数的指针,我必须使所有调用的参数具有相同的数字和类型。

在 Java 中,通常的方法是拥有一个由所有想要回调的类实现的接口,如下所示:

public interface ICallable {
    public void call_me(Object data);
}

现在这对我不起作用,因为

  • 要回调的对象可能有一组不同的方法来接受调用
  • 呼叫者不是决定应该拨打什么电话的人

也许我的问题是我试图为各种回调提供一个通用的数据结构和调用过程,但原则上,这对我来说似乎是有意义的。

在 Java 中,有什么好的设计模式可以解决这种情况?

有帮助吗?

解决方案

我想您会发现接口是最好的解决方案。我不明白你反对他们。如果接收者需要调用不同的方法,则让接口方法调用不同的方法。

如果您的接收器类需要有多个处理程序,您可以使用实现接口的匿名内部类,一个用于您需要的每种类型的处理程序。例如,如果发送方使用名为“ListenerInterface”的接口,则接收方可能会定义一个实现 ListenerInterface 的匿名内部类并调用接收方方法“handlerFunction”。

   sender.addListener(new ListenerInterface()
   {
      public void callback(Object arg)
      {
         handlerFunction(arg);
      }
   });

其他提示

您可以使用类似于的概念 匿名内部类

另一个参考 这里

正如您所描述的,我将使用一个接口,然后使用匿名类进行回调。例如,从呼叫者内部:

ICallback callback = new ICallback() { 
    public void call_me(Object data) { this.actionToCall(data); }
}
serverObject.doX(callback);

(语法可能与此略有不同。)

这样,您可以在原始调用者中(在调用时)指定完成后要执行的操作。

如果您确实不想使用接口(相信我,您会这样做!),您可以使用反射来获取您想要调用的方法,然后将其传递给需要执行调用的方法。这与您将得到的 C 函数指针非常接近。

反射(可能)会比接口方式慢(但这并不重要,除非它被频繁调用)。

反射不会像接口方法那样进行编译时类型检查(这意味着您可能会在运行时崩溃)。

反射的代码也会比接口方式更丑陋。

但如果您真的非常想模拟 C 函数指针,那么反射就可以满足您的需求。

回调是一种普遍的想法,您不应该尝试一刀切的界面。使您的回调接口特定于用途。它应该与传递给它并进行回调的类型的语义相匹配。回调接口的通常实现将作为匿名内部类完成。抵制在外部类中实现接口的诱惑,从而导致类型不连贯。

我可能误解了这个问题,但在我看来,建立某种事件系统会让你受益匪浅。

基本上,您设置了一个事件处理程序,并且想要了解该事件的类订阅了该事件处理程序。因此,对于您的问题,当 X 完成时,它将触发您的对象将订阅的 FinishedProcessingEvent() 。当您的对象接收到此事件(以及关心该事件的任何其他订阅者)时,它将执行正确的操作(Y 和 Z)。这些操作是在对象内定义的,因此不同的对象可以根据相同的事件执行不同的操作。

这有帮助吗?

我确信有一些有趣的模式可以解决您的问题,但我会选择使用基础设施的简单方法。将请求和响应填充到消息队列(如 JMS)中,您的系统可能会更简单、更健壮,因为您可以在几秒钟或几周内处理事件,而不必担心系统重新启动、持久性和消息完整性。

我没有深入研究它,但是 Java 5+ 未来 接口(或其子接口)可能对此有用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top