回調機制簡單的理解

回調與普通調用

方法的回調與普通的方法調用不同,普通方法調用一般需要程序員手動調用,而回調方法則是由系統、服務器或者別的程序調用程序員自己創建、實現接口/抽象類的方法、重寫父類的方法,這種方法一般稱爲回調函數(鉤子函數)。

一、普通的方法調用:

public class A {
    
    void methrod() {
        
    }

    public static void main(String[] args) {
        A a = new A();
        a.methrod();// 普通的方法調用
    }
    
}

二、方法回調:分爲兩種

1.一種是系統調用我們重寫好的方法(這種方法通常我們不需要自己手動去調用),例如Servlet的init、doGet、service、doPost方法,Android中Activity的onCreate、onDestroy等方法。這些方法。系統/服務器會調用我們重寫的父類/接口的方法,不需要程序員手動調用。這些方法通常由系統提供接口/抽象類/父類給程序員,由程序員自己去實現。這種回調在通用性質的框架中非常常見:對於一個具有通用性質的程序架構來說,程序架構完成整個應用的通用功能、流程。但是在某個特定節點上,需要一段業務相關的代碼——通常的程序框架無法實現這段代碼,那麼程序架構會在這些節點上留下接口或者抽象方法供程序員進行重寫。

2.A類調用B類中的b方法,在b方法和B類的方法後續方法執行過程中,又調用了A類的a方法,這個過程也被稱爲方法的回調,而a也被稱爲A類的回調方法。這種情況下的回調方法(也即b方法)既有可能是系統/服務器操作的,也有可能是程序員自己調用的。

爲什麼會有這種情況的回調,是因爲A類需要別的類(如B類,爲了方便表述,後續將用B類來代稱其他類)去處理A的請求或者A所引發的事件,同時A需要在B執行完畢後,得到返回的結果或者程序執行完畢的通知。這個時候就需要B在自己的類內部有調用A的a方法去通知A任務執行完畢,或者將返回值返回給A。可能會有人問,那我爲什麼不可以在B類中構造一個方法,如b2,這個方法是屬於B的,不屬於A,由b2這個方法去完成向A類通知以及發送返回結果的功能呢?

我是這樣理解的:如果非要這麼做,b2則要將返回結果和通知發送給A類,如果A中沒有方法去接收b2發送過來的通知或者結果(方法的return值),那麼A就需要寫一個a2方法去完成這一任務,或者給b2方法添加一個A a的形參,在b2方法體內獲取到A類對象,然後操縱這個a對象獲取b2方法的返回值/通知。這樣一方面增加了代碼的冗餘;另一方面我們需要調用兩個方法,一個b2,一個a2。並且通常情況下,A類需要拿到b2方法的結果/結束通知,配合自己類內部的一些局部變量/成員變量/方法返回值,進行進一步的方法執行,如果將返回結果/通知的方法分配給A(也就是將b2方法的功能移植到a中),在a方法中操縱和獲取A類的局部變量/成員變量/方法返回值回比在b2方法中要輕鬆容易的多,並且還不容易打破封裝特性(比如需要在返回結果/通知的方法中訪問A類的一些私有方法或者私有屬性,a方法顯然比b2方法更安全,也更簡潔)。

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