Java 返回完整的未来<;无效>;还是完全的未来<>;?
我想写一个异步方法,返回一个。未来的唯一目的是跟踪方法何时完成,而不是其结果。返回Java 返回完整的未来<;无效>;还是完全的未来<>;?,java,future,return-type,completable-future,Java,Future,Return Type,Completable Future,我想写一个异步方法,返回一个。未来的唯一目的是跟踪方法何时完成,而不是其结果。返回CompletableFuture或CompletableFuture是否更好?是否有理由选择其中一种,或者它们可以互换 它本身从许多方法返回CompletableFuture java.nio在:Future connect(SocketAddress remote)中有一个Future 另一方面,java.util.concurrent类喜欢并返回Future:例如,使用Future提交(可运行任务) 请注
CompletableFuture
或CompletableFuture
是否更好?是否有理由选择其中一种,或者它们可以互换
- 它本身从许多方法返回
CompletableFuture
在:java.nio
中有一个Future connect(SocketAddress remote)
Future
- 另一方面,
类喜欢并返回java.util.concurrent
:例如,使用Future
Future提交(可运行任务)
- 运行时泛型对它没有影响
- 编译-我无法想象某个方法会接受
,但不会接受Future
Future
- 开发-如果未来的结果没有任何意义,那么通过声明向用户说明这一点是一个很好的实践
因此
Future
更可取。查看CompletableFuture
API,您会发现CompletableFuture
与副作用一起使用,这种方法无法获得结果(因为它不存在),例如:
在这里返回一个CompletableFuture
会让人困惑,因为实际上没有结果,我们只关心完成情况。采用消费者
和可运行项
的方法返回可完成的未来
,例如:然后接受
,然后接受同步
<代码>消费者和可运行
通常用于副作用
Void
的另一个用例是当您真的不知道结果时。例如:CompletableFuture.allOf
,传递的列表可能是源于Runnable的CompletableFuture,因此我们无法获得结果
话虽如此,
CompletableFuture
只有在您没有其他选择的情况下才是好的,如果您可以返回结果,请继续,如果调用方不感兴趣,则可能选择放弃。你说你只对完成感兴趣,然后是的,CompletableFuture
将完成这项工作,但是如果你的API用户知道CompletableFuture
是一个选项,而你只是代表他们决定他们永远不需要结果,他们就会恨你 最好使用CompletableFuture
发现者,Future
是一个较小的API缺陷。在Java6中,submit()
方法在内部使用了Future
,因此其返回类型被设置为Future
。在Java7中,实现更改为在内部使用Future
,但更改API为时已晚,因此返回值保持为Future
较新的Java API使用
Future
和CompletableFuture
。这些是我们应该遵循的示例。合适的类型取决于其语义。所有列出的选项都承诺发出完成信号,并可能异步返回异常
:CompletableFuture
告诉用户没有预期的结果Void
TheCompletableFuture
表示contains值的类型未定义,即任何值都可以传递?
CompletableFuture
类从CompletionStage
继承了几个方便的方法。但它也允许方法的调用者触发未来的完成,这似乎是错误的,因为方法本身负责发出完成信号。还有一个cancel(…)
方法,它在CompletableFuture
的默认实现中是毫无意义的,因为它不会取消执行
:Future
告诉用户没有预期的结果Void
TheFuture
表示包含值的类型未定义,即任何值都可以传递?
Future
缺少CompletionStage
中的便捷方法。它不允许触发将来的完成,但可以取消执行
下一个选项是CompletionStage
:
:CompletionStage
告诉用户没有预期的结果。存在绑定处理程序的方便方法,但不存在Void
方法。方法的调用方无法触发cancel(…)
的完成CompletionStage
:来自
和未来
的一组方法。它表示没有结果,提供了方便的方法以及取消选项。方法的调用方无法触发完成阶段
的完成CompletionStage
cancel(…)
方法可能适合您的场景,也可能不适合。因此,如果不需要取消,我建议使用CompletionStage
,如果需要取消执行的选项,则使用
。如果选择了
,您可能希望自己创建一个接口,该接口继承自Future
和CompletionStage
,用作返回类型,而不是将长类型交集直接放在方法声明中
您应该避免使用声明的返回类型返回CompletableFuture
be
CompletableFuture.runAsync(Runnable runnable);