【问题标题】:Should I return CompletableFuture or Future when defining API?定义 API 时应该返回 CompletableFuture 还是 Future?
【发布时间】:2016-01-21 17:50:47
【问题描述】:

在 Java 8 中,接口或抽象类定义返回 CompletableFuture 而不是返回 Future 的 API 更好吗?考虑到it is ugly converting Future to CompletableFutureCompletableFuture 将使调用者更灵活地直接使用函数式样式这一事实,API 只返回Future 的充分理由是什么?

【问题讨论】:

  • 我刚刚在 2 分钟前问了这个问题,并且已经有 1 次接近投票了吗?询问编程/设计选择的实际用例有什么问题?
  • 我猜它有点宽泛。也许添加用例是什么?
  • 用例是我正在设计一个执行文件处理的异步 API,我过去的知识告诉我要返回 Future,但是在从我链接的其他 SO 问题中学习之后,我觉得Java8 告诉我返回 CompletableFuture。我不确定,需要帮助。
  • 想想你是否真的想让来电者完成你的未来。否则,如果您只想支持相关操作/处理步骤的链接,您可能希望返回 CompletionStage
  • @jazd 从 Java 9 开始,您可以简单地调用 copy​() 来获得类似分离的 CompletableFuture,或者,您可以返回一个 minimalCompletionStage​()。后者返回一个无法从外部完成的阶段;调用toCompletableFuture() 将再次返回一个新的未来,其完成不会传播回来。

标签: java interface java-8 future completable-future


【解决方案1】:

我想我会回来并提供一些关于我最终决定的更新:

对于我自己的代码/设计,我使用 CompletableFuture 作为返回类型,因为

  • 这是我要使其可扩展的内部部分的protected abstract 方法;
  • 我不需要接口来定义绑定;
  • 这个返回类型的主要用途是一个Future(用于异步IO),我个人觉得CompletableFuture提供的函数式API是对未来开发者使用函数式风格的额外好处/提醒/鼓励。

话虽如此,如果我一直在设计公共 API,我肯定会使用 CompletableStage 接口作为返回类型,因为:

【讨论】:

    【解决方案2】:

    我的 2 cts:

    • 通过返回 Future,您可以保持选项开放,并且可以返回 Future 或 CompletableFuture - 从调用者的角度来看,这没有区别。
    • 通过返回 CompletableFuture,您为调用者提供了更多选项(他们获得了更多方法),但您也承诺返回该类型的 Future - 如果两年后您意识到返回 BetterFuture 会更有意义,您将不得不改API,不好。

    因此,您可能应该评估您将来想要返回 CompletableFuture 以外的东西的可能性(哈哈)并做出相应的决定。

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      相关资源
      最近更新 更多