用Java講明白 回調函數Callback的來龍去脈(一)

小弟我別的不行 自我感覺表達能力不錯,對於Callback的理解,之前網上看了一堆文章,人都看吐了,大多都是抄來抄去,沒有意義。於是花了點時間自己弄懂了,這裏分享給大家,如果你看到我這篇日誌,恰巧你又想了解回調函數到底是怎麼回事,那麼恭喜你,你運氣不錯,請你耐心把這篇文章看完。

爲了便於將事情表達清楚,我這裏給大家編一個場景吧:
碼農(Programmer)現在需要做幾件事情:
1、敲代碼一整天(敲代碼)
2、將今天工作代碼上傳到Github上(上傳代碼)
3、備註一下完成日期(記錄下完成的日期)

下面我們用程序去實現:
程序一共就三個類:
Programmer(碼農類)
Github(Github類 用於保存碼農提交的代碼)
TestDemo(用於測試並顯示結果)
如下所示:
在這裏插入圖片描述
首先來看Programmer類的代碼,很簡單:

public class Programmer {

    public void code(){                       
        System.out.println("coding");      //step 1.寫代碼
        new Github().push();               //step 2.提交代碼 
        recordToday();                     //step3. 記錄的日期
    }

    public void recordToday(){
        System.out.println("i'm done " + new Date());
    }
}

下面是Github類的代碼,他只幹一件事情 就是上傳代碼:

public class Github {
    public void push(){
        System.out.println("git push");
    }
}

TestDemo就更簡單了,讓Programmer工作:

public class TestDemo {
    public static void main(String args[]){
        Programmer p = new Programmer();
        p.code();
    }
}

運行結果如下:
在這裏插入圖片描述


上面所有代碼都沒有涉及 回調函數,下面開始對上面代碼進行稍微的修改,引入回調函數。
大家想一想,可否給苦逼程序員一條生路,讓他提交代碼之後就啥也不管了,像
記錄日期:recodeToday()這種事讓Github類去負責。
換句話說,Github類的push()函數執行完後,Github類去調用Programmer類的recodeToday()方法,而不是Programmer自己去調用,略微改動後
代碼如下:
Programmer:

public class Programmer {
    public void code(){
        System.out.println("coding");
        new Github().push(this);   //注意這裏 傳入了this給Github類  (後續會解釋)
        //這裏沒有 step3,碼農沒有自己調用 recordToday()方法.
    }

    public void recordToday(){
        System.out.println("i'm done " + new Date());
    }
}

Github:

public class Github {
    public void push(Programmer p ){   //push的參數多了Programmer類
        System.out.println("git push");
        p.recordToday();    //因爲Github類裏有Programmer的引用
         							//可以通過引用去調用recodeToday方法
    }
}

TestDemo 類代碼無任何變化,不再展示。
運行結果無任何變化,不再展示。

我想大家現在應該理解什麼是回調了吧。
回調就是 A類的a()函數 調用B類的x()函數後,B類的x()函數會反過來調用A類的某函數。
例如上面例子中Programmer類的code()函數調用了 Github類的push()函數,而push()函數又反過來調用了Programmer類的recordToday()函數。
recordToday函數就是被“回調”了。

回調就是這個意思,想必大家都明白了吧。
但是真正寫Java回調的時候上述步驟會稍微、輕微、特別小有一點點變動,可以讓“回調”看起來更優雅一些,下一篇文章:
《用Java講明白 回調函數Callback的來龍去脈(二)》將作進一步解釋。

代碼我放在github上了:
https://github.com/zkuestc/CallbackDemo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章