我想编写一个返回CompletableFuture的异步方法。未来的唯一目的是跟踪方法何时完成,而不是其结果。返回CompletableFuture<Void>还是CompletableFuture<?>更好?是否有理由选择其中一种或另一种,还是它们是可以互换的?
CompletableFuture本身从它的许多方法返回CompletableFuture<Void>。java.nio有一个Future<Void> in AsynchronousSocketChannel:Future<Void> connect(SocketAddress remote)。java.util.concurrent类(如ExecutorService和ScheduledExecutorService )返回Future<?>:例如,使用Future<?> submit(Runnable task)。请注意,我只询问返回类型,而不是参数列表、变量声明或其他上下文。
发布于 2016-08-17 17:16:05
最好使用CompletableFuture<Void>。
According to this answer由Sotirios Delimanolis发现,Future<?>是一个小的API缺陷。在Java6中,submit()方法在内部使用Future<Object>,因此它的返回类型被设置为Future<?>。在Java7中,实现更改为在内部使用Future<Void>,但是更改API为时已晚,因此返回值保留为Future<?>。
更新的Java使用Future<Void>和CompletableFuture<Void>。这些都是我们应该学习的例子。
发布于 2015-12-11 22:46:00
返回CompletableFuture还是CompletableFuture更好? 是否有理由选择其中一种或另一种,还是它们是可以互换的?
有三种情况下的代码可能会影响:
Future<Void>但不接受Future<?>的情况。Future的结果没有任何意义,那么通过声明向用户说明这一点是一个很好的实践。因此,Future<Void>更可取。
发布于 2015-12-11 22:55:08
查看CompletableFuture API,您会发现CompletableFuture<Void>是与副作用类似的方法,无法获得结果(因为它不存在),例如:
CompletableFuture.runAsync(Runnable runnable);在这里返回一个CompletableFuture<Object>会让人感到困惑,因为没有结果,我们只关心完成。取Consumers和Runnables的方法返回CompletableFuture<Void>,ex:thenAccept,thenAcceptAsync。Consumer和Runnable一般用于副作用。
Void的另一个用例是当您真的不知道结果时。例如:CompletableFuture.allOf,传递的列表可能是一个来自Runnable的CompletableFuture,因此我们无法获得结果。
尽管如此,只有当您没有其他选项时,CompletableFuture<Void>才是好的,如果您可以返回结果,那么请执行它,如果调用方不感兴趣,可以选择放弃。您说您只对完成感兴趣,那么是的,CompletableFuture<Void>将完成这项工作,但是如果您的API用户知道CompletableFuture<T>是一个选项,并且您代表他们决定他们永远不需要结果的话,他们会讨厌您。
https://stackoverflow.com/questions/34233375
复制相似问题