如何以最佳方式用另一段代码包围回调调用?

6 java asynchronous javafx callback java-8

我有一个简单,实用的界面:

public interface Callback<T> {
    void invoke(T param);
}
Run Code Online (Sandbox Code Playgroud)

我做了很多异步操作,如:

public void getSubfolders(Folder folder, Callback<FolderList> result){
    asyncExecutor.submit(() -> {
        FolderList list = folder.get_SubFolders();
        result.invoke(list);
    });
}
Run Code Online (Sandbox Code Playgroud)

结果必须在a上处理main thread.为此,我有一个JavaFX方法:

Platform.runLater(Runnable task);

这使得我的代码像这样一个混乱(并且这种模式在50种其他方法中重复):

public void getSubfolders(Folder folder, Callback<FolderList> result){
     asyncExecutor.submit(() -> {
         FolderList list = folder.get_SubFolders();
         Platform.runLater(() -> result.invoke(list));
     });
}
Run Code Online (Sandbox Code Playgroud)

我想用每个回调调用包装Platform.runLater(...).我想出的唯一一件事就是default method:

public interface Callback<T> {
    void invoke(T param);

    default void invokeOnMain(T param){
        Platform.runLater(() -> invoke(param));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我打电话result.invokeOnMain(list).

对于像这样的模式,有更好的方法吗?

dav*_*xxx 2

它在某种程度上击败了默认方法的意图

默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码的二进制兼容性。

为什么不将此代码放在特定的类中:

public class PlatformUtil {
   public static <T> void invoke(Callback<T> result, T param){
     Platform.runLater(() -> result.invoke(param));
   }
}
Run Code Online (Sandbox Code Playgroud)

从客户端来看,您还可以使用static importforPlatformUtil.invoke来进一步减少样板代码。

它可以给出:

import static PlatformUtil.invoke;
...
public void getSubfolders(Folder folder, Callback<FolderList> result){
     asyncExecutor.submit(() -> {
         FolderList list = folder.get_SubFolders();
         invoke(result, list);
     });
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用实例方法做同样的事情。