java - 为什么接口可以实现回调?
大家讲道理
大家讲道理 2017-04-18 10:05:37
0
2
370

don‘t call me ,i will call you,代码怎么就知道什么时机调用呢?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回覆(2)
黄舟

一般框架都有設定 callback/hook 的介面, 當框架內某個事件發生時, 就會呼叫使用者設定的回呼.
例如下面的一個簡單範例:

public class CallbackTest {
    public static void main(String args[]) throws Exception {
        // 1. 实例化一个回调逻辑.
        Callback userCallback = new Callback() {
            @Override
            public void call(String message) {
                System.out.println("Call from framework, message: " + message);
            }
        };

        // 2. 初始化一个假象的框架, 并设置用户的回调接口.
        SomeFramework framework = new SomeFramework(userCallback);

        // 3. 启动框架
        framework.start();

        Thread.sleep(5000);
    }

    interface Callback {
        void call(String message);
    }

    static class SomeFramework implements Runnable {
        Callback userCallback;

        public SomeFramework(Callback userCallback) {
            this.userCallback = userCallback;
        }

        public void start() {
            new Thread(this).start();
        }

        @Override
        public void run() {
            try {
                Thread.sleep(3000);
                somethingHappened();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        // 4. 当框架内的状态变化时或者是发生了某个事件时, 就调用用户设置的回调接口.
        private void somethingHappened() {
            userCallback.call("Something happended!");
        }
    }
}

其實就是有點像事件驅動或觀察者模式, 框架保存有用戶的回調接口, 而這個接口就承擔了框架和用戶代碼溝通的橋樑, 當框架檢測到某個事件發生後, 通過此回調接口來通知使用者代碼.

阿神

約定…約定啊…建議你看看觀察者模式

例如你給按鈕加一個 action listener

button.addActionListener(new ActionListener() {
    public actionPerformed(ActionEvent e) {
        // do something
    }
});

約定按鈕在按下的時候會觸發 action listener,所以你在加的時候,就已經知道了什麼時候會呼叫。雖然不明白具體是哪個時間點,但是你知道如果發生了什麼事情,就會呼叫。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板