如何在Java中实现回调

时间:2009-09-25 08:50:05

标签: asynchronous callback

我有一个名为CommunicationManager的类,负责与服务器通信。

它包含方法login()onLoginResponse()。在用户登录的情况下,必须调用方法login(),并且当服务器响应时,执行方法onLoginResponse()

我想要做的是将操作与用户界面绑定。在GUI类中,我创建了一个名为mCommunicationManager的CommunicationManager实例。从GUI类中,login()方法只是由行

调用
mCommunicationManager.login();

我不知道如何将方法从GUI类绑定到onLoginResponse()。例如,如果GUI类包含显示从服务器接收的消息的方法notifyUser()

我真的很感激,当类GUI.notifyUser()的实例从服务器收到消息时,是否有人可以展示如何绑定方法以便从GUI类(例如mCommunicationManager)执行该方法并执行方法CommunicationManager.onLoginResponse()

谢谢!

4 个答案:

答案 0 :(得分:25)

我可以看到你使用的两种模式。一个是皮特提到的publish/subscribe or observer pattern。我认为这可能是你想要的,但是看到问题提到绑定一个方法以便以后执行,我想我应该提到Command pattern

Command模式基本上是一个解决方案,因为java不会将方法(函数)视为第一类对象,因此无法传递它们。相反,您可以创建一个可以传递的接口,并封装有关如何调用原始方法的必要信息。

所以对你的例子来说:

 interface Command {
     public void execute();
 }

然后在执行login()函数时传入此命令的实例(未经测试,我总是忘记如何正确获取匿名类):

 final GUI target = this;
 command = new Command() {
     @Override
     public void execute() {
         target.notifyUser();
     }
 };
 mCommunicationManager.login(command);

在login()函数中(管理器保存对命令的引用):

public void login() {
    command.execute();
}

编辑: 我应该提一下,虽然这是它如何工作的一般解释,但在Java中已经存在一些用于此目的的管道,即ActionListener和相关类(actionPerformed()基本上是{{1在execute())中。这些主要用于AWT和/或Swing类,因此具有特定于该用例的特性。

答案 1 :(得分:3)

Java中用于实现回调行为的习惯是Listeners。使用所需事件的方法构造一个接口,具有一个用于将侦听器对象注册到事件源的机制。发生事件时,请在每个已注册的侦听器上调用相应的方法。这是AWT和Swing事件的常见模式;对于随机选择的示例,请参阅FocusListener和相应的FocusEvent对象。

请注意,Java AWT和Swing中的所有事件都最终从EventObject继承,惯例是调用侦听器SomethingListener和事件SomethingEvent。虽然您可以随心所欲地命名代码,但是维护代码更容易遵守平台的惯例。

答案 2 :(得分:1)

你可以看一下swt-snippets(看一下听众)

http://www.eclipse.org/swt/snippets/

或者你使用runnable类,在创建实例时用'callback'代码覆盖run方法

答案 3 :(得分:1)

据我所知,Java不支持方法绑定或C#之类的委托。

您可能必须通过接口实现此功能(例如,像Command listener。)。

也许这个网站会有所帮助:

http://www.javaworld.com/javaworld/javatips/jw-javatip10.html