30/09/2018, 20:40

Ý nghĩa và cách dùng CallBack trong Java

Hi, cho mình hỏi ý nghĩa của Callback trong Java ạ?
Có ví dụ sau:

interface CallBack {
    void methodToCallBack();
}

class CallBackImpl implements CallBack {
    public void methodToCallBack() {
        System.out.println("I've been called back");
    }
}

class Caller {

    public void register(CallBack callback) {
        callback.methodToCallBack();
    }

    public static void main(String[] args) {
        Caller caller = new Caller();
        CallBack callBack = new CallBackImpl();
        caller.register(callBack);
    }
} 

Sao không gọi trực tiếp mà phải thông qua Callback?

Sáng Béo viết 22:46 ngày 30/09/2018

không biết e có nên lập topic mới không nhưng cho e hỏi chút là Call-back là gì ạ? e học Win32api cũng có cái Call-back nhưng e chưa nắm rõ lắm ạ.

Quân viết 22:50 ngày 30/09/2018

hiểu đơn giản đây là 1 ví dụ về tính đa hình - trừu tượng trong OOP, giả sử như ví dụ bạn đưa ra, bạn muốn thêm 1 đối tượng CallBackImpl1 khi đc callback xuất ra System.out.println(“Oh, No, It called back”); thì bạn làm thế nào, chả nhẽ lại viết thêm 1 hàm register truyền thẳng CallBackImpl1 vào à, thay vì thế ta truyền vào interface Callback, sau này nếu bạn muốn thay đổi gì thì chỉ cần tạo mới class CallbackImplxyz implement Callback rồi truyền vào method register là đc, khi ấy thằng Caller k cần biết thằng được truyền vào là thằng nào, chỉ cần biết nó là Callback và có khả năng methodToCallBack là đc, vừa đỡ lặp code ở thằng caller, vừa đảm bảo tính đa hình, mà lại vừa k làm mất đi tính đúng đắn đã được kiểm chứng trước đó của chương trình ở thằng caller.

*grab popcorn* viết 22:55 ngày 30/09/2018

Callback thì nói cho đơn giản dễ hiểu là cái hàm (or 1 đoạn code thực thi được) dùng để truyền vô như 1 tham số (parameter) của một hàm khác và có thể gọi lại / dùng sau hoặc khi cần thì dùng.
Như trong C thì hàm qsort cần 1 hàm callback dùng để so sánh 2 giá trị.

Callback đc hỗ trợ qua nhiều cách lắm. Ví dụ như function pointer, lamda expression, …
Java dùng interface để cung cấp cơ chế này
Như Comparator, Comparable Interface.
Còn vì sao dùng Interface thay vì dùng Class implement cái Interface thì bạn qloved nói rõ rồi

Daniel viết 22:45 ngày 30/09/2018

Cảm ơn mọi người, giair thích rất dễ hiểu ạ!

Phan Hoàng viết 22:54 ngày 30/09/2018

Callback (gọi ngược trở lại) có thể giải thích theo một số case trong đời sống như sau:
1- Asynchronous callback (bất đồng bộ)
Bạn nghi ngờ vợ ngoại tình và muốn có chứng cớ để còn mà oánh bỏ mẹ cái thằng dám “mèo chuột” nữ nhân của mình. Nhưng mà theo dõi 3 ngày rồi mà chẳng thấy gì cả mặc dù biểu hiện ở nhà của vợ nhìn rất chi là ngứa mắt. Mà giờ xin nghỉ cả tháng đi theo dõi vợ thì ai đi làm nuôi con bây giờ. Giải pháp?

Thuê 1 thằng thám tử, còn mình thì đi làm, khi nào có “event: vào nhà nghỉ” thì thằng thám tử sẽ nhấc phone, alo để mình phi tới xin tý “huyết”.

class Event {
}

interface ThamTu {
    void phoneToHusband();
}

class ThamTuConan implements ThamTu {
    private  Event event = new Event();

    public ThamTuConan(){
         monitor();
         somthingHappen(event);
    }

    public void phoneToHusband() {
       //check event
       if(event == event.VO_HOTEL){
         System.out.println("Đại bàng gọi thợ săn, thỏ con chui vào hang. Mang gậy tới mần thịt nhé.");
       }
    }
}

class Husband {
    public void registerEnterHotelEvent(ThamTu thamtu) {
        thamtu.phonetoHusband();
    }

   public static void main(String[] args) {
      Husband chong = new Husband();
      ThamTu conan = new ThamTuConan();
      chong.registerEnterHotelEvent(conan); //register thám tử còn mình thôi monitor

     chong.continueWorkingtoFeedChildren(); // tiếp tục đi làm kiếm tiền nuôi con
   }
}

Ví dụ này bạn có thể liên hệ với EventListener trong lập trình Swing vậy. Bất cứ khi nào có sự kiện click trên Button, thì cái callback function trong EventListener sẽ được fire (trong Java không có khái niệm function callback, nên để lập trình hướng sự kiện event-driven programming buộc phải thiết kế object/interface callback. Nếu trong javascript thì khái niệm callback này sẽ dễ hiểu hơn.

$('#btnEnterHotel').click(phoneToHusband);
function phoneToHusband(){
      alert("Đại bàng gọi thợ săn, thỏ con chui vào hang. Mang gậy tới mần thịt nhé.");
}

Hàm click sẽ gọi một callback function khi có sự kiện bấm trên nút btnEnterHotel.

Phan Hoàng viết 22:56 ngày 30/09/2018

Tiếp …
2. Synchronous callback
Theo định nghĩa của callback thì nó là một đoạn code được truyền như là tham số tới một đoạn code khác, và sẽ được gọi tại một thời điểm nào đó. Khác với async callback, sync callback sẽ được gọi ngay khi xử lý (thường được gọi vào cuối hàm, function call at the back ^^, nhất là trong lập trình Win32API, thường thì khi cuối hàm, bạn muốn OS làm một magic task nào đó, bạn sẽ viết kiểu generic vậy để lập trình viên có thể chọn: ví dụ như clear RAM, báo thức, …).

Bạn có thể map nó với 1 trường hợp trong thực tế như sau:
Bạn đi vệ sinh, trong lúc đó vì quá rảnh rỗi, bạn muốn tận dụng thời gian làm một cái gì đó nữa, ví dụ như chơi game, xem siếc, … Bạn sẽ define các function này và tuỳ vào context mà gọi nó ra (ví dụ đang chơi CoC thì buồn đi iiiii …, nếu giờ không oánh nữa thì chúng nó cướp hết resource, vậy ta vào và chơi tiếp)

function diWC(i, callbackFn) {
     i++; // đếm cừu
     callbackFn();
}

function playCoC() {
    alert("Chơi tiếp");
}

function seeSiec() {
    alert("Xem tiếp");
}

//context: sợ bị cướp tài nguyên 
diWC(1, playCoC);

//context: xa vợ lâu ngày
diWC(1, seeSiec);

Cái này được thiết kế khá nhiều trong Java, ví dụ như thực hiện so sánh các phần tử trong ArrayList, bạn truyền 1 callback interface Comparable vào (ArrayList được gọi là high-level layer, còn Comparable được gọi là low-level layer). Bạn thích so sánh kiểu gì thì làm, ArrayList không quan tâm, miễn là sau khi so sánh ta có một ArrayList được sắp xếp. Đây cũng là một design pattern khá thông dụng và được áp dụng nhiều.

Reoteu Ray viết 22:53 ngày 30/09/2018

vậy có phải tác dụng của kỹ thuật callback là khả năng gọi 1 hàm tại thời điểm thực thi (runtime) tùy vào từng trường hợp nhất định trong lúc chương trình thực thì mà nó sẽ gọi đến hàm callback đúng ko vậy???

Phan Hoàng viết 22:48 ngày 30/09/2018

Có 2 loại mà bạn, một loại dùng trong async (lập trình hướng sự kiện) và một loại dùng cho sync (lập trình kiểu hook) đó bạn. Tùy vào context mà nó sẽ gọi callback tương ứng.

Callback: trong tiếng Việt có thể hiểu theo 2 nghĩa:

  • Gọi lại hàm chính khi hàm phụ xong xuôi (Call back to main function).
  • Gọi tại cuối của hàm (Call at back of main function). Tất nhiên, hook có thể trước, sau hoặc giữa tuy nhiên thông dụng thì hay cho vào cuối khi đã thực thi xong 1 logic nào đó rồi.
Bài liên quan
0