摘要
在 Java 支持方法指针之前,Java 接口不能提供一种实现回调的好方法。假如您习惯于传递在事件驱动编程模型中调用的函数指针,则您会喜欢本技巧。
熟悉 MS-Windows 和 X Window System 事件驱动编程模型的开发人员,习惯于传递在某种事件发生时调用(即“回调”)的函数指针。Java 的面向对象模型目前并不支持方法指针,这样似乎就不可能使用这种很好的机制。但我们并不是一点办法都没有!
Java 的接口支持提供了一种获得回调的等价功能的机制。其技巧就是:定义一个简单接口,并在该接口中声明我们要调用的方法。
例如,假定我们希望在某个事件发生时得到通知。我们可以定义一个接口:
public interface InterestingEvent {
// 这仅是一个常规方法。因此假如需要,
// 它可有返回值,也可接收参数。
public void interestingEvent();
}
这使得我们可以控制实现该接口的类的任何对象。因此,我们不必关心任何外部类型信息。与在将 C++ 代码用于 Motif 时使用窗口小部件的数据域来容纳对象指针的难以控制的 C 函数相比,这种方法要好得多。
发出事件信号的类必须等待实现了 InterestingEvent 接口的对象,并在适当时候调用 interestingEvent() 方法。
public class EventNotifier {
private InterestingEvent ie;
private boolean somethingHappened;
public EventNotifier(InterestingEvent event) {
// 保存事件对象以备后用。
ie = event;
// 还没有要报告的事件。
somethingHappened = false;
testReCall();
}
/**
* 回调函数
*
* @author Ken_xu
*/
public void testReCall() {
somethingHappened = true;
doWork();
}
// ...
public void doWork() {
// 检查在别处设置的谓词。
if (somethingHappened) {
// 通过调用接口的这个方法发出事件信号。
ie.interestingEvent();
}
// ...
}
// ...
}
在上例中,我使用 somethingHappened 谓词来跟踪是否应触发事件。在许多情况下,调用此方法足以保证向 interestingEvent() 发出信号。
希望接收事件通知的代码必须实现 InterestingEvent 接口,并将自身引用传递给事件通知程序。
public class CallMe implements InterestingEvent {
private EventNotifier en;
public CallMe() {
// 创建事件通知程序,并将自身引用传递给它。
en = new EventNotifier(this);
}
int doNum = 0;
// 为事件定义实际的处理程序。
public void interestingEvent() {
// 噢!必定发生了感受好的事件!
// 执行某些操作 ...
System.out.println("doNum=" + doNum++);
}
// ...
}
这就是所要做的全部工作。我希望这个简单的 Java 习惯用法会使您更有信心地转向 Java。
这里我补充一个测试函数
public class TestCallMe {
/**
* @param args
* @author Ken_xu
*/
public static void main(String[] args) {
CallMe cm = new CallMe();
System.out.println("====");
}
}
分享到:
相关推荐
在Java编程中,回调函数是一种设计模式,它允许一个对象在另一个对象...在给定的示例中,`Button.java`和`OnButtonClickListener.java`展示了如何通过接口来实现回调,而`CallMeTest.java`则可能是测试回调功能的代码。
本案例将详细讲解如何使用Java来实现企业微信的回调配置,并提供相关的工具代码示例。 1. **企业微信API介绍** 企业微信提供了丰富的API接口,包括但不限于用户管理、部门管理、消息推送等。回调配置主要是通过...
Java面试如何用Java实现一个回调函数
在Java支持方法指针之前,Java接口不能提供一种实现回调的好方法。如果您习惯于传递在事件驱动编程模型中调用的函数指针,则您会喜欢本技巧。 熟悉MS-Windows和X Window System事件驱动编程模型的开发人员,习惯...
在Java中,实现回调有以下两种主要方式: 1. **通过接口**:创建一个接口,其中定义了回调方法。当需要回调时,将实现了该接口的对象作为参数传递给需要回调的类。当特定条件满足时,这个类就调用接口中的方法,...
下面我们将深入探讨回调函数的基本原理、应用场景以及如何在Java中实现回调。 首先,回调函数的主要优点是可以解耦代码,使得调用者和被调用者之间不直接依赖具体的实现。例如,在事件驱动的系统中,事件监听器就是...
在Java中,我们可以使用接口或者匿名内部类来实现回调机制。 首先,我们需要理解什么是回调。回调是一种编程技术,当一个函数执行完毕后,它会调用另一个预先指定的函数,这个被调用的函数就是回调函数。在Java中,...
在标题提及的“[iOS]Objective-C利用协议实现回调函数(类似java的回调函数)”中,我们主要讨论的是Objective-C如何通过协议(Protocol)来实现类似于Java中的回调函数功能。这种机制对于异步编程、事件处理以及...
1. **回调接口**:在Java中,回调机制通常通过定义一个接口来实现。这个接口会包含一个或多个待回调的方法。例如,我们可以定义一个名为`Callback`的接口,其中有一个`execute()`方法: ```java public interface ...
使用Java实现回调函数代码示例,在Java中,回调函数通常是通过接口实现的。接口定义了回调方法,实现了该接口的类在特定事件发生时会调用这些方法。代码中TaskExecutor 类有一个执行任务的方法,它接受一个实现了 ...
为了实现回调,这个类可能包含一个接口类型字段,表示回调接口: ```java public class MyThread extends Thread { private CallBack callback; // 定义回调接口引用 public void setCallBack(CallBack callback...
本实例将聚焦于Java版本的实现,通过深入理解回调模式,我们可以更好地构建稳定、高效的微信企业号应用。 首先,我们要明白微信企业号回调的基本原理。当微信企业号接收到特定事件(如用户关注、取消关注、消息发送...
首先,我们来看如何使用接口实现回调。假设有一个`Calculator`接口,它定义了一个`calculateDone`方法: ```java public interface Calculator { void calculateDone(int result); } ``` 然后创建一个`...
在Java中,回调函数通常通过接口来实现。当一个对象(如类A)调用另一个对象(如类B)的方法时,如果这个方法需要在完成之后执行特定的回调操作,那么类B可以要求类A提供一个实现了特定接口的对象。这个接口中定义的...
Java多线程实现 自定义 的 回调函数. 手写 完成,亲测 完成,可以 直接运行,Demo ,具有一定参考价值,供大家阅读 下载,谢谢
总的来说,理解和实现"C++ JNI多线程回调java"涉及到对JNI接口的深入理解,对多线程编程的掌握,以及对Java并发模型的认识。这是一个高级的跨语言编程话题,需要开发者具备扎实的C++和Java基础。在实际项目中,这样...
回调是通过将一个方法的引用(或者在Java中,一个接口的实现)作为参数传递给另一个方法来实现的。当被调用的方法完成其主要任务后,它会调用传入的回调方法,从而启动后续的处理流程。 在Java中,回调通常与监听器...
在Java中,由于没有像C++那样的函数指针,因此我们利用接口来实现回调功能。下面将详细介绍如何在Java中实现回调机制。 1. **定义回调接口** 在Java中,回调通常通过定义一个接口来实现。接口中声明了回调方法,当...
本话题将深入探讨如何在Android中使用JNI进行多线程编程,并实现native方法对Java函数的回调。 1. **JNI基础知识**: - JNI是Java平台的一部分,为Java应用程序提供了与本地代码交互的能力。开发者可以通过JNI在...
"C回调Java方法"是指从C代码中调用Java的方法,这通常通过Java Native Interface(JNI)实现。JNI是Java平台标准的一部分,它提供了一套接口让Java代码能够调用本地(非Java)代码,反之亦然。本文将详细探讨C回调...