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).
对于像这样的模式,有更好的方法吗?
它在某种程度上击败了默认方法的意图:
默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码的二进制兼容性。
为什么不将此代码放在特定的类中:
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)
当然,您可以使用实例方法做同样的事情。
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |