Tôi đã triển khai hỗ trợ gọi lại / ủy nhiệm trong Java bằng cách sử dụng sự phản chiếu. Thông tin chi tiết và nguồn làm việc có sẵn trên trang web của tôi .
Làm thế nào nó hoạt động
Chúng tôi có một lớp nguyên tắc có tên Callback với một lớp lồng nhau có tên WithParms. API cần gọi lại sẽ lấy đối tượng Gọi lại làm tham số và, nếu cần, hãy tạo Callback.WithParms làm biến phương thức. Vì rất nhiều ứng dụng của đối tượng này sẽ được đệ quy, nên nó hoạt động rất sạch sẽ.
Với hiệu năng vẫn là ưu tiên cao đối với tôi, tôi không muốn được yêu cầu tạo một mảng đối tượng vứt đi để giữ các tham số cho mỗi lần gọi - sau tất cả trong một cấu trúc dữ liệu lớn có thể có hàng ngàn phần tử và trong quá trình xử lý tin nhắn kịch bản cuối cùng chúng ta có thể xử lý hàng ngàn cấu trúc dữ liệu.
Để đảm bảo an toàn cho chủ đề, mảng tham số cần tồn tại duy nhất cho mỗi lần gọi phương thức API và để sử dụng hiệu quả, cùng một cách sử dụng cho mỗi lần gọi lại; Tôi cần một đối tượng thứ hai sẽ rẻ để tạo ra để liên kết cuộc gọi lại với một mảng tham số để gọi. Nhưng, trong một số tình huống, invoker sẽ có một mảng tham số vì những lý do khác. Vì hai lý do này, mảng tham số không thuộc về đối tượng Gọi lại. Ngoài ra, sự lựa chọn của việc gọi (truyền các tham số dưới dạng một mảng hoặc dưới dạng các đối tượng riêng lẻ) thuộc về API bằng cách sử dụng hàm gọi lại cho phép nó sử dụng bất kỳ lời gọi nào phù hợp nhất với hoạt động bên trong của nó.
Lớp WithParms lồng nhau, sau đó, là tùy chọn và phục vụ hai mục đích, nó chứa mảng đối tượng tham số cần thiết cho các lệnh gọi lại và nó cung cấp 10 phương thức invoke () bị quá tải (với từ 1 đến 10 tham số) để tải mảng tham số và sau đó tải mảng tham số gọi mục tiêu gọi lại.