一、什么是回调方法?

在Java中,回调方法是一种常见的编程模式,也被称为回调函数或回调接口。回调方法是一种通过函数指针或接口实现的机制,允许一个对象在另一个对象发生特定事件时被通知。

举一个例子:你在周五晚上发微信问女朋友:你在干嘛?一起出来吃个饭吧。

在编程中有同步调用,异步调用,回调。

同步调用:你在等待你女朋友回复的过程中,你一直没有做其它事情,那么你就是同步调用。

A对象的方法a()调用B对象的方法b()的过程中线程会一直阻塞,直到执行完B对象中的方法b()。

注:图片源自参考文献[1]。

image-20230330120548843

异步调用:你在等待你女朋友回复的过程中,你还做了其它的事情,比如你正在看我的这篇文章,那么你是异步调用。

A对象中的方法a()调用B对象中的方法b()的过程中创建新的线程去执行b()中的代码,这样不会阻塞A对象所在线程的运行。

异步通常分两种情况:第一,不需要调用结果,直接调用即可,比如发送消息通知;第二,需要异步调用结果,在Java中可使用Future+Callable实现。

注:图片源自参考文献[1]。

image-20230330120924069

回调:你在等待你女朋友回复的过程中,你做了其它的事情,并且最终等到了女朋友的回复,那么是回调。

A调用B,B处理完之后再调用A提供的回调方法通知结果。

注:图片源自参考文献[1]。

image-20230330121114098

二、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] https://www.51cto.com/article/645183.html

Q.E.D.


热爱生活,热爱程序