不同系统的回调 Java

回调函数是一种常用的编程模式,在不同的系统中有不同的实现方式。在Java中,回调函数通常使用接口的方式来实现。本文将介绍几种常见的回调方式,并提供相应的代码示例。

  1. 回调函数的定义

回调函数是一种将一个函数作为参数传递给另一个函数,并在后者执行过程中调用前者的一种机制。回调函数常用于异步编程,将原本需要等待的逻辑转化为可执行的函数。

  1. 接口回调

在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方法。

  1. 函数式接口回调

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注解,以确保该接口只包含一个抽象方法。

  1. 事件回调

除了接口回调,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方法。

  1. 甘特图

下图展示了接口回调和事件回调的执行流程。

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
  1. 类图

下图展示了接口回调和事件回调的类关系。

classDiagram
    class Caller {
        +doSomething(Callback)
    }

    interface Callback {
        +onCallback()
    }

    class EventSource {
        -listeners: List<EventListener>
        +registerListener(EventListener)
        +triggerEvent()
    }

    interface EventListener {
        +onEvent()
    }

    Caller --> Callback
    Caller --> EventSource
    Event