API中的返回Futures.immediateFuture(x)是否是反模式?

问题描述 投票:2回答:3

https://github.com/google/guava/wiki/ListenableFutureExplained中似乎没有涵盖此>

但是很常见的模式

@Override
public ListenableFuture<Void> loadResources() {
  fastSyncMethod();

  return Futures.immediateFuture(null);
}

在此方面是否有指导?在使用ListenableFuture调用或实现API时,我们可以放心地做出一些假设,这会影响到许多使用ListenableFutures的代码用法。

<<

[我们不知道syncMethod中有什么,但是似乎选择该名称来表示“某些同步通信代码”,在这种情况下,您显示的代码示例显然是反模式。我怀疑它不是在guava文档中涵盖的,仅仅是因为他们从没想过有人会写它。这就好比告诉人们,如果它实际上总是返回null,或者不要将它声明为“ doX”(如果实际上是Y),则不要将其声明为返回对象。签名保证了行为,而返回Future则保证了您(至少有时),返回不完整的未来。
[如果您的方法有时会延迟工作,而有时却不会,那么在无延迟的路径上返回完整的将来是有意义的。以下是一些准则:

考虑调用方的异常处理:它可能期望某些类型的故障导致将来失败,并且可能无法正确处理直接引发异常的方法。

    不要直接调用任何引发InterruptedException的代码。这肯定表明您正在打破呼叫者对您是否异步的期望。
  • IOException也是一个危险信号,因为它通常伴随调用者可能期望异步发生的缓慢的网络或磁盘调用。
  • 不幸的是,对于[[how
  • 没有将您的同步调用转换为异步调用的通用解决方案。理想情况下,您应该在后台使用异步库来进行网络调用,以免线程在服务器之间反弹字节时不会聚集灰尘。如果这不是一种选择,那么您将不得不增加一个线程池-只需关注正在创建的线程数即可。
  • 我的2c

    对我来说似乎是一种反模式。

    [它留下了两个用于错误处理的代码路径,调用代码中的必需try {} catch {}以及ListenableFuture管道中的异常

    它使syncMethod()的执行时间与调用者是否可以在同步中采用该方法有关。对于高吞吐量代码,即使是将日志语句写入磁盘或使用InetAddress api也是阻塞操作。

      [它打破了期货的某种功能范式,例如参照透明性。
  • 您的示例显示了重写的方法,在这里很重要。
  • 通过使方法返回ListenableFuture,接口或超类
    allows实现的作者将异步返回。同样,该方法的调用者知道可以容忍异步返回值。

    作为回报,该实现承诺是非阻塞的。因为它返回ListenableFuture,所以它有机会将所有昂贵的工作转移到后台线程,使用异步网络调用或其他方法。

    但是,它不必异步运行。

    如果实现是非阻塞的并且可以快速完成,则绝对没有理由强迫执行线程切换只是为了满足对工作将完成的期望异步地。在这种情况下,immediateFuture()是符合接口的好方法。

    所以,您的示例是反模式吗?这取决于syncMethod()的价格。如果速度很快(无阻塞,并且不进行冗长的计算),则该示例很好。如果速度很慢(也许它在网络上等待,或者分解了很大的数字),那么可以,它是一种反模式。

    guava
    3个回答
    4
    投票

    1
    投票

    [它留下了两个用于错误处理的代码路径,调用代码中的必需try {} catch {}以及ListenableFuture管道中的异常


    1
    投票
    allows实现的作者将异步返回。同样,该方法的调用者知道可以容忍异步返回值。
    © www.soinside.com 2019 - 2024. All rights reserved.