如果喜欢本文章,记得收藏哦!
更多内容欢迎到个人博客中浏览。
一、什么是回调方法?
在Java中,回调方法是一种常见的编程模式,也被称为回调函数或回调接口。回调方法是一种通过函数指针或接口实现的机制,允许一个对象在另一个对象发生特定事件时被通知。
举一个例子:你在周五晚上发微信问女朋友:你在干嘛?一起出来吃个饭吧。
在编程中有同步调用,异步调用,回调。
同步调用:你在等待你女朋友回复的过程中,你一直没有做其它事情,那么你就是同步调用。
A对象的方法a()调用B对象的方法b()的过程中线程会一直阻塞,直到执行完B对象中的方法b()。
注:图片源自参考文献[1]。
异步调用:你在等待你女朋友回复的过程中,你还做了其它的事情,比如你正在看我的这篇文章,那么你是异步调用。
A对象中的方法a()调用B对象中的方法b()的过程中创建新的线程去执行b()中的代码,这样不会阻塞A对象所在线程的运行。
异步通常分两种情况:第一,不需要调用结果,直接调用即可,比如发送消息通知;第二,需要异步调用结果,在Java中可使用Future+Callable实现。
注:图片源自参考文献[1]。
回调:你在等待你女朋友回复的过程中,你做了其它的事情,并且最终等到了女朋友的回复,那么是回调。
A调用B,B处理完之后再调用A提供的回调方法通知结果。
注:图片源自参考文献[1]。
二、Java中常用的回调方法
1、接口回调方法
定义一个接口,该接口中包含要回调的抽象方法,然后在实现类中真正写回调的执行逻辑。
定义一个接口,包含要回调的方法。
public interface Callback {
void onEventOccurred();
}
定义一个该接口的实现类,写上具体的回调逻辑。
public class EventHandler implements Callback {
@Override
public void onEventOccurred() {
// handle the event...
}
}
写一个触发回调方法的类,注意把上面的接口注入到该类中。
public class EventNotifier {
private Callback callback;
public void setCallback(Callback callback) {
this.callback = callback;
}
public void doSomething() {
// do something...
if (callback != null) {
// 触发回调方法
callback.onEventOccurred();
}
}
}
在主类中写如下代码进行测试
EventNotifier notifier = new EventNotifier();
EventHandler handler = new EventHandler();
notifier.setCallback(handler); // 把含有回调方法的接口的实现类注入到触发回调对象中
notifier.doSomething(); // 触发回调方法 handler.onEventOccurred()
2、匿名内部类回调方法
public class EventNotifier {
private Callback callback;
public void setCallback(Callback callback) {
this.callback = callback;
}
public void doSomething() {
// do something...
if (callback != null) {
callback.onEventOccurred();
}
}
}
EventNotifier notifier = new EventNotifier();
notifier.setCallback(new Callback() {
@Override
public void onEventOccurred() {
// handle the event...
}
});
notifier.doSomething(); // the anonymous callback object's onEventOccurred() will be called
3、lambda回调方法
public class EventNotifier {
private Runnable callback;
public void setCallback(Runnable callback) {
this.callback = callback;
}
public void doSomething() {
// do something...
if (callback != null) {
callback.run();
}
}
}
EventNotifier notifier = new EventNotifier();
notifier.setCallback(() -> {
// handle the event...
});
notifier.doSomething(); // the lambda expression will be executed as the callback function
三、参考文献
[1] 参考文献