合适的类型取决于其语义。所有列出的选项都承诺信号完成并可能异步返回异常。
- CompletableFuture<Void>:
Void
表示不需要期望结果。
- CompletableFuture<?>:
?
表示包含值的类型未定义,任何值都可以传递。
CompletableFuture类从CompletionStage继承了几个方便的方法。但是,它也允许您方法的调用者触发future的完成,这似乎是错误的,因为您的方法负责自己发出完成信号。还有一个cancel(...)方法,在CompletableFuture的默认实现中相当无意义,因为它不会取消执行。
- Future<Void>:
Void
表示不需要期望结果。
- Future<?>:
?
表示包含值的类型未定义,任何值都可以传递。
Future缺少来自CompletionStage的便利方法。它不允许触发future的完成,但执行可以被取消。
下一个选项是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>,以作为返回类型而不是直接将长类型交叉放在方法声明中。
您应该避免使用声明了返回类型 CompletableFuture
的返回,因为调用者有可能触发 future 的完成。这样做会导致代码混乱和意外的挂起,因为不清楚哪个代码负责触发完成。使用提到的更受限制的类型之一,让类型系统防止方法调用者意外触发完成。