教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

Java中有哪些回調(diào)機(jī)制?

更新時(shí)間:2023年06月06日09時(shí)56分 來(lái)源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

  回調(diào)機(jī)制是一種編程模式,用于在某個(gè)特定事件發(fā)生時(shí)通知或調(diào)用預(yù)定義的代碼片段或函數(shù)。在回調(diào)機(jī)制中,一個(gè)函數(shù)將另一個(gè)函數(shù)作為參數(shù)傳遞,并在合適的時(shí)機(jī)調(diào)用該函數(shù)。

  在Java中,有以下幾種回調(diào)機(jī)制可用:

  1.接口回調(diào)

  這是Java中最常見(jiàn)的回調(diào)機(jī)制之一。通過(guò)定義一個(gè)接口,其中包含需要回調(diào)的方法,然后在另一個(gè)類(lèi)中實(shí)現(xiàn)該接口并提供具體的回調(diào)方法。在合適的時(shí)機(jī),調(diào)用方將調(diào)用接口方法,實(shí)際執(zhí)行的代碼將在實(shí)現(xiàn)接口的類(lèi)中執(zhí)行。

  接下來(lái)我們看一個(gè)接口回調(diào)的示例代碼:

// 定義回調(diào)接口
interface Callback {
    void onCallback();
}

// 實(shí)現(xiàn)回調(diào)接口的類(lèi)
class CallbackImpl implements Callback {
    @Override
    public void onCallback() {
        System.out.println("Callback called");
    }
}

// 調(diào)用方類(lèi)
class Caller {
    private Callback callback;

    public void setCallback(Callback callback) {
        this.callback = callback;
    }

    public void doSomething() {
        // 執(zhí)行一些操作
        System.out.println("Doing something");

        // 在適當(dāng)?shù)臅r(shí)候調(diào)用回調(diào)方法
        if (callback != null) {
            callback.onCallback();
        }
    }
}

// 使用回調(diào)機(jī)制
public class Main {
    public static void main(String[] args) {
        Caller caller = new Caller();
        Callback callback = new CallbackImpl();
        caller.setCallback(callback);

        caller.doSomething();
    }
}

  在上面的示例中,Caller類(lèi)調(diào)用doSomething()方法時(shí),會(huì)在適當(dāng)?shù)臅r(shí)機(jī)調(diào)用回調(diào)接口的方法 onCallback()。在Main類(lèi)中,創(chuàng)建了一個(gè)Caller實(shí)例和一個(gè)CallbackImpl實(shí)例,將CallbackImpl實(shí)例設(shè)置為Caller的回調(diào),當(dāng)doSomething()被調(diào)用時(shí),將觸發(fā)回調(diào)方法。

  2.事件監(jiān)聽(tīng)器

  Java中許多GUI框架都使用事件監(jiān)聽(tīng)器回調(diào)機(jī)制。在這種機(jī)制下,組件(如按鈕、文本框等)注冊(cè)監(jiān)聽(tīng)器,用于捕獲特定事件的發(fā)生,并在事件發(fā)生時(shí)調(diào)用回調(diào)方法。

  接下來(lái)我們看一個(gè)使用事件監(jiān)聽(tīng)器的示例代碼(使用Swing):

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main {
    public static void main(String[] args) {
        JButton button = new JButton("Click me");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Button clicked");
            }
        });

        JFrame frame = new JFrame("Callback Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(button);
        frame.pack();
        frame.setVisible(true);
    }
}

  在上面的示例中,創(chuàng)建了一個(gè)按鈕對(duì)象button,并為其添加一個(gè)匿名的ActionListener實(shí)現(xiàn)。當(dāng)按鈕被點(diǎn)擊時(shí),actionPerformed()方法將被調(diào)用,并打印出"Button clicked"。

  3.Future和Callback

  Java的并發(fā)包中提供了Future和Callback接口,用于處理異步任務(wù)的回調(diào)。Future表示一個(gè)可能還沒(méi)有完成的異步任務(wù)的結(jié)果,而Callback則是在任務(wù)完成時(shí)進(jìn)行回調(diào)的接口。

  接下來(lái)是一個(gè)使用Future和Callback的示例代碼:

import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executor = Executors.newSingleThreadExecutor();

        Future<String> future = executor.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(2000);
                return "Task completed";
            }
        });

        future.addListener(new Runnable() {
            @Override
            public void run() {
                try {
                    String result = future.get();
                    System.out.println(result);
                } catch (InterruptedException | ExecutionException e) {
                    e.printStackTrace();
                }
            }
        }, executor);

        executor.shutdown();
    }
}

  在上面的示例中,通過(guò)submit()方法提交一個(gè)異步任務(wù),返回一個(gè)Future對(duì)象。然后使用addListener()方法注冊(cè)一個(gè)Runnable回調(diào),在任務(wù)完成時(shí)會(huì)調(diào)用該回調(diào)方法,并在其中獲取任務(wù)的結(jié)果。

  4.Java回調(diào)函數(shù)庫(kù)

  除了基本的回調(diào)機(jī)制外,Java中還有一些開(kāi)源的回調(diào)函數(shù)庫(kù)可用,如Guava、Apache Commons等。這些庫(kù)提供了豐富的回調(diào)功能和工具,使回調(diào)的使用更加便捷和靈活。

  例如,使用Guava庫(kù)的ListenableFuture和Futures類(lèi),可以實(shí)現(xiàn)更高級(jí)的回調(diào)模式。

import com.google.common.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ListeningExecutorService executor = MoreExecutors.newDirectExecutorService();

        ListenableFuture<String> future = executor.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(2000);
                return "Task completed";
            }
        });

        Futures.addCallback(future, new FutureCallback<String>() {
            @Override
            public void onSuccess(String result) {
                System.out.println(result);
            }

            @Override
            public void onFailure(Throwable t) {
                t.printStackTrace();
            }
        }, executor);

        executor.shutdown();
    }
}

  在上面的示例中,使用Guava庫(kù)的ListeningExecutorService和Futures.addCallback()方法實(shí)現(xiàn)了異步任務(wù)的回調(diào)。FutureCallback接口中的onSuccess()方法在任務(wù)成功完成時(shí)調(diào)用,onFailure()方法在任務(wù)發(fā)生異常時(shí)調(diào)用。

  以上便是Java中常見(jiàn)的回調(diào)機(jī)制。根據(jù)具體的應(yīng)用場(chǎng)景和需求,選擇適合的回調(diào)機(jī)制可以提高代碼的靈活性和可維護(hù)性。

0 分享到:
和我們?cè)诰€交談!