不同系统的回调 Java
回调函数是一种常用的编程模式,在不同的系统中有不同的实现方式。在Java中,回调函数通常使用接口的方式来实现。本文将介绍几种常见的回调方式,并提供相应的代码示例。
- 回调函数的定义
回调函数是一种将一个函数作为参数传递给另一个函数,并在后者执行过程中调用前者的一种机制。回调函数常用于异步编程,将原本需要等待的逻辑转化为可执行的函数。
- 接口回调
在Java中,使用接口来实现回调函数是最常见的方式。首先,定义一个接口,包含需要回调的方法。
public interface Callback {
void onCallback();
}
然后,在需要使用回调的地方,将实现了该接口的对象传递进去,并在适当的地方调用回调方法。
public class Caller {
public void doSomething(Callback callback) {
// 在适当的地方调用回调方法
callback.onCallback();
}
}
public class Main {
public static void main(String[] args) {
Caller caller = new Caller();
caller.doSomething(new Callback() {
@Override
public void onCallback() {
// 回调方法的具体实现
System.out.println("Callback called!");
}
});
}
}
这样,当doSomething方法执行到适当的地方时,会自动调用传入的回调对象的onCallback方法。
- 函数式接口回调
Java 8引入了函数式接口的概念,即只包含一个抽象方法的接口。使用函数式接口作为回调的方式更加简洁。
@FunctionalInterface
public interface Callback {
void onCallback();
}
public class Caller {
public void doSomething(Callback callback) {
callback.onCallback();
}
}
public class Main {
public static void main(String[] args) {
Caller caller = new Caller();
caller.doSomething(() -> System.out.println("Callback called!"));
}
}
注意,在定义回调接口时,需要使用@FunctionalInterface注解,以确保该接口只包含一个抽象方法。
- 事件回调
除了接口回调,Java还支持使用事件回调的方式实现回调函数。事件回调包括两个主要部分:事件源和事件监听器。
首先,定义一个事件监听器接口,包含需要回调的方法。
public interface EventListener {
void onEvent();
}
然后,定义一个事件源类,并提供注册和触发事件的方法。
public class EventSource {
private List<EventListener> listeners = new ArrayList<>();
public void registerListener(EventListener listener) {
listeners.add(listener);
}
public void triggerEvent() {
for (EventListener listener : listeners) {
listener.onEvent();
}
}
}
最后,在需要使用回调的地方,创建一个事件监听器的实现类,并将其注册到事件源上。
public class Main {
public static void main(String[] args) {
EventSource eventSource = new EventSource();
eventSource.registerListener(new EventListener() {
@Override
public void onEvent() {
System.out.println("Event triggered!");
}
});
eventSource.triggerEvent();
}
}
这样,当事件源触发事件时,会依次调用注册的事件监听器对象的onEvent方法。
- 甘特图
下图展示了接口回调和事件回调的执行流程。
gantt
dateFormat YYYY-MM-DD
title 回调函数的执行流程
section 接口回调
doSomething: 2022-01-01, 1d
onCallback: 2022-01-02, 1d
section 事件回调
triggerEvent: 2022-01-01, 1d
onEvent: 2022-01-02, 1d
- 类图
下图展示了接口回调和事件回调的类关系。
classDiagram
class Caller {
+doSomething(Callback)
}
interface Callback {
+onCallback()
}
class EventSource {
-listeners: List<EventListener>
+registerListener(EventListener)
+triggerEvent()
}
interface EventListener {
+onEvent()
}
Caller --> Callback
Caller --> EventSource
Event