合适的类型取决于它的语义。所有列出的选项都承诺发出完成信号,并可能异步返回异常。
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因为调用者可能会触发未来的完成。这样做会故意导致代码混乱和令人惊讶的挂起,因为现在还不清楚哪个代码负责触发完成。使用上述更受限制的类型之一,让类型系统防止您的方法的调用者无意中触发完成。