Tôi có một đơn giản, giao diện chức năng:Làm thế nào để bao quanh lời gọi lại với một đoạn mã khác một cách tốt nhất?
public interface Callback<T> {
void invoke(T param);
}
tôi thực hiện nhiều hoạt động không đồng bộ như:
public void getSubfolders(Folder folder, Callback<FolderList> result){
asyncExecutor.submit(() -> {
FolderList list = folder.get_SubFolders();
result.invoke(list);
});
}
Kết quả phải được xử lý trên một main thread
. Cho rằng, tôi có một phương pháp JavaFX
:
Platform.runLater(Runnable task);
Mà làm cho mã của tôi một mớ hỗn độn như thế này (và mô hình này được lặp lại trong 50 phương pháp khác):
public void getSubfolders(Folder folder, Callback<FolderList> result){
asyncExecutor.submit(() -> {
FolderList list = folder.get_SubFolders();
Platform.runLater(() -> result.invoke(list));
});
}
Tôi muốn để bọc từng lời gọi lại với Platform.runLater(...)
. Điều duy nhất tôi đã đưa ra là một default method
:
public interface Callback<T> {
void invoke(T param);
default void invokeOnMain(T param){
Platform.runLater(() -> invoke(param));
}
}
Và sau đó, tôi chỉ cần gọi result.invokeOnMain(list)
.
Có cách tiếp cận tốt hơn cho các mẫu như thế này không?
Chỉ cần một (off-topic) lưu ý rằng văn bản bạn trích dẫn từ Oracle không phải là một tuyên bố đúng. Việc thêm một phương thức mặc định vào một giao diện hiện có không * đảm bảo * tương thích nhị phân: có những trường hợp mà nó có thể phá vỡ mã đã biên dịch hiện có. (Cụ thể, nếu một lớp đang tồn tại thực hiện giao diện được đề cập và cũng thực hiện một giao diện khác đã định nghĩa một phương thức mặc định có cùng chữ ký, bạn sẽ phá vỡ lớp đó bằng cách thêm phương thức mặc định vào giao diện của bạn.) –
Bạn nói đúng. Nó nên được đề cập. Bây giờ, để công bằng, về mặt xác suất, nó thực sự không phổ biến. – davidxxx