私はそれらのそれぞれで例を見てきましたが、深さの違いが何であるかを正確に知る必要があります、時には両方を使用して同じ結果を得ることができると思うので、正しいを選択できるように知りたい1?
それぞれを使用する利点は何ですか?
この例のように両方とも機能します:
public CompletionStage<Result> getNextQueryUUID() {
return CompletableFuture.supplyAsync(() -> {
String nextId = dbRequestService.getNextRequestQueryUUID();
return ok(nextId);
}, executor);
}
public CompletableFuture<Result> getNextQueryUUID() {
return CompletableFuture.supplyAsync(() -> {
String nextId = dbRequestService.getNextRequestQueryUUID();
return ok(nextId);
}, executor);
}
この例は、
Play framework
で実行されます。
CompletionStage<T>
は、このインターフェースの唯一の実装クラスである CompletabeFuture<T>
であるインターフェースです。 Java CompletionStage<T>
のドキュメント]を見ると、CompletionStageインターフェースが1つのCompletionStageを取得して別のCompletionStage
に変換するメソッドを提供していることがわかります。 CompletionStagesによって実際にCompletabeFuture<T>
オブジェクトとして返されるオブジェクト。
したがって、CompletabeFuture<T>
を使用することはCompletionStage<T>
を使用することと同じですが、将来可能になる新しいクラスの基本インターフェイスとして使用できるだけでなく、多くの降順型のターゲット型としても使用できますList<Integer> integerList = new ArrayList<>();
ではなくArrayList<Integer> integerList = new ArrayList<>();
を行う傾向があるため
詳細については、投稿を読むことができます CompletionStageとCompletableFutureの紹介 .
CompletableFuture
はCompletionStage
です。ただし、その名前が示すように、
complete
またはcompleteExceptionally
を使用して完了できます。Future
:get
メソッドなどを使用して結果を取得できます。私見、あなたの例のように、ほとんどのAPIでは、CompletionStage
を使用する必要があります。
complete
などのメソッドを呼び出し元に公開する必要はありません。get
によって提供されるFuture
のようなブロッキング呼び出しを使用する代わりに、非同期の方法で戻り値を使用することが期待されます。1つはインターフェイスで、もう1つはクラスです。通常、実装ではなくインターフェイスを返しますが、ここではそうではないと思います。 CompletableFuture
を返すのは理にかなっています。
nless SpringのDelegatingCompletableFuture
など、そのインターフェイスの他の実装を使用していますが、例からはそうではありません。