合适的类型取决于它的语义。所有列出的选项都承诺发出完成信号,并可能异步返回异常。
CompletableFuture<Void>
:Void
告诉用户没有预期的结果。
CompletableFuture<?>
这?
意味着包含值的类型在可以传递任何值的意义上是未定义的。
该类CompletableFuture
从CompletionStage
. 但它也允许您的方法的调用者触发未来的完成,这似乎是错误的,因为您的方法负责自己发出信号完成。还有一种cancel(...)
方法在默认实现中毫无意义,CompletableFuture
因为它不会取消执行。
Future<Void>
:Void
告诉用户没有预期的结果。
Future<?>
这?
意味着包含值的类型在可以传递任何值的意义上是未定义的。
Future
缺乏来自CompletionStage
. 它不允许触发未来的完成,但可以取消执行。
下一个选项是CompletionStage<Void>
:
CompletionStage<Void>
:Void
告诉用户没有预期的结果。存在绑定处理程序的便捷方法,但cancel(...)
方法不存在。您的方法的调用者无法触发CompletionStage
.
<CancellableFuture extends Future<Void> & CompletionStage<Void>>
: 来自Future<Void>
和的方法集CompletionStage<Void>
。它表明没有结果,存在便利方法以及取消选项。您的方法的调用者无法触发CompletionStage
.
该cancel(...)
方法的缺失可能适合您的场景,也可能不适合。因此,如果您不需要取消执行,我建议CompletionStage<Void>
您使用<CancellableFuture extends Future<Void> & CompletionStage<Void>>
,如果您需要取消执行的选项,请使用。如果您选择<CancellableFuture extends Future<Void> & CompletionStage<Void>>
,您可能希望自己创建一个接口,该接口继承自Future<Void>
并CompletionStage<Void>
用作返回类型,而不是直接将 long 类型交集放在方法声明中。
您应该避免使用声明的返回类型返回,CompletableFuture
因为调用者可能会触发未来的完成。这样做会故意导致代码混乱和令人惊讶的挂起,因为现在还不清楚哪个代码负责触发完成。使用上述更受限制的类型之一,让类型系统防止您的方法的调用者无意中触发完成。