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
    告诉用户没有预期的结果
  • CompletableFuture
    The
    表示contains值的类型未定义,即任何值都可以传递
CompletableFuture
类从
CompletionStage
继承了几个方便的方法。但它也允许方法的调用者触发未来的完成,这似乎是错误的,因为方法本身负责发出完成信号。还有一个
cancel(…)
方法,它在
CompletableFuture
的默认实现中是毫无意义的,因为它不会取消执行

  • Future
    Void
    告诉用户没有预期的结果
  • Future
    The
    表示包含值的类型未定义,即任何值都可以传递
Future
缺少
CompletionStage
中的便捷方法。它不允许触发将来的完成,但可以取消执行

下一个选项是
CompletionStage

  • CompletionStage
    Void
    告诉用户没有预期的结果。存在绑定处理程序的方便方法,但不存在
    cancel(…)
    方法。方法的调用方无法触发
    CompletionStage
    的完成
  • :来自
    未来
    完成阶段
    的一组方法。它表示没有结果,提供了方便的方法以及取消选项。方法的调用方无法触发
    CompletionStage
    的完成
缺少
cancel(…)
方法可能适合您的场景,也可能不适合。因此,如果不需要取消,我建议使用
CompletionStage
,如果需要取消执行的选项,则使用
。如果选择了
,您可能希望自己创建一个接口,该接口继承自
Future
CompletionStage
,用作返回类型,而不是将长类型交集直接放在方法声明中

您应该避免使用声明的返回类型返回
CompletableFuture
be
CompletableFuture.runAsync(Runnable runnable);