2

我目前有一个名为 Promise 的类,其工作方式如下:

  1. 它具有未来价值
  2. 它总是可以接受使用未来值作为参数的后续操作
  3. 当值完成时,函数队列启动
  4. 未来完成后添加的任何功能同步发生

所以这似乎是我们在 Java 中使用的函数式编程的设计模式。重要的是我们可以对延迟事件进行菊花链式连接,据我了解,这是 C# 3.0 语言中更多内置的功能,但您必须与 Java 类一起破解。不幸的是,第一,我不知道有比“承诺”或“未来”更好的名称,这似乎具有误导性,因为重点更多的是“DelayedCallStack”而不是手头的价值,第二,我不知道除了编写我们自己相当复杂的 Promise 类之外,还有其他方法可以做到这一点。理想情况下,我想把它从功能性 Java 库中提取出来,但到目前为止,我还没有理解这个概念。

注意 Java 甚至没有为带有参数的异步回调提供语言/库支持,这是我对能够找到它感到如此悲观的原因之一。

那么,这种模式是什么,可以在库中实现吗?

4

2 回答 2

3

看看 Guava 中的 ListenableFuture:

http://code.google.com/p/guava-libraries/wiki/ListenableFutureExplained

ListenableFuture 允许您添加回调以在 Future 计算完成时执行。您可以控制回调在哪个线程池下执行,因此它们可以同步或异步执行。

于 2012-07-10T19:23:57.250 回答
2

我只能说我们在 Flex (ActionScript) 中实现了几乎完全相同的东西,我们也称它为 Promise。在 Clojure 中,promise 是相当轻量级的东西:对它的get操作会阻塞,直到另一个线程deliver成为 promise。它基本上是一个单元素队列,只是它永远保留它的值,所以后续get的 s 总是成功的。

你所拥有的是一种承诺,再加上它的价值观察者。我不知道有任何特殊术语恰好涵盖了这种情况。

编辑

现在我注意到您的“承诺/未来”可能拥有产生其未来价值的代码(至少它是否存在并不完全明显)。我提到的 ActionScript 实现并没有这样做——它的行为类似于 Clojure,值是从外部提供的。我认为这是未来和承诺之间的关键区别。

于 2012-07-10T19:27:23.953 回答