it-swarm.com.de

Was ist der Unterschied zwischen 'CompletionStage' und 'CompletableFuture'?

Ich habe in jedem von ihnen ein Beispiel gesehen, aber ich muss genau wissen, worin der Unterschied liegt. Denn manchmal denke ich, dass ich beide verwenden kann, um das gleiche Ergebnis zu erzielen ein?

was ist der Vorteil bei der Verwendung von jedem von ihnen?

Wie in diesem Beispiel werden beide bearbeitet:

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);
}

Dieses Beispiel wird in Play framework ausgeführt.

17

CompletionStage<T> ist eine Schnittstelle, die CompletabeFuture<T> die einzige implementierende Klasse dieser Schnittstelle ist. Wenn Sie sich das Java doc für CompletionStage<T> Ansehen, werden Sie feststellen, dass die CompletionStage-Schnittstelle Methoden zum Aufnehmen und Umwandeln eines CompletionStage in ein anderes CompletionStage enthält. Diese Objekte werden von den CompletionStages als eigentliche CompletabeFuture<T> - Objekte zurückgegeben.

Die Verwendung von CompletabeFuture<T> Ist also ähnlich wie die Verwendung von CompletionStage<T>, Jedoch kann letzteres als Basisschnittstelle für mögliche neue Klassen in der Zukunft sowie als Zieltyp für viele absteigende Klassen verwendet werden tippt genau so, wie wir es tun wollen List<Integer> integerList = new ArrayList<>(); anstatt ArrayList<Integer> integerList = new ArrayList<>();

sie können den Beitrag lesen Einführung in CompletionStage und CompletableFuture für weitere Details.

12
Aomine

Eine CompletableFuture ist eine CompletionStage. Wie der Name schon sagt, ist es jedoch so

  • completable: Kann mit complete oder completeExceptionally abgeschlossen werden.
  • a Future: Sie können die get-Methode usw. verwenden, um das Ergebnis zu erhalten.

IMHO, in den meisten APIs, wie in Ihrem Beispiel, sollten Sie CompletionStage verwenden, da

  • Die Implementierung bietet normalerweise den Mechanismus, um die Phase abzuschließen. Sie müssen/wollen keine Methoden wie complete für den Aufrufer verfügbar machen.
  • Es wird erwartet, dass der Aufrufer den zurückgegebenen Wert asynchron verwendet, anstatt blockierende Aufrufe wie get zu verwenden, die von Future bereitgestellt werden.
7
Xiao

Eine ist eine Schnittstelle und die andere ist eine Klasse. Normalerweise geben Sie die Schnittstelle und nicht die Implementierung zurück, aber ich bezweifle, dass dies hier der Fall ist. Die Rückgabe von CompletableFuture ist für mich sinnvoller. 

Es sei denn Sie verwenden natürlich eine andere Implementierung dieser Schnittstelle, wie Spring's DelegatingCompletableFuture, aber aus Ihren Beispielen nicht. 

1
Eugene