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?
Bài liên quan
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 ạ.
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.
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
Cảm ơn mọi người, giair thích rất dễ hiểu ạ!
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”.
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.
Hàm click sẽ gọi một callback function khi có sự kiện bấm trên nút btnEnterHotel.
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)
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.
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???
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: