2017-11-30 109 views
7

Widziałem przykład w każdym z nich, ale muszę wiedzieć dokładnie, jaka jest różnica w głębokiej, ponieważ czasami myślę, że mogę użyć obu z nich, aby uzyskać ten sam wynik, więc chcę wiedzieć, żebym mógł wybrać właściwy?Jaka jest różnica między "CompletionStage" i "CompletableFuture"?

Jakie są korzyści z korzystania z każdego z nich?

jak w poniższym przykładzie oba pracowali:

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

Ten przykład uruchomić w Play framework.

Odpowiedz

3

CompletionStage<T> to interfejs, który CompletabeFuture<T> jest jedyną klasą wykonawczą tego interfejsu. Patrząc na dokument java dla CompletionStage<T>, zauważysz, że interfejs programu CompletionStage zapewnia metody do pobrania jednego CompletionStage i przekształcenia go w inny CompletionStage. Jednak obiekty te są zwracane przez obiekty CompletionStages jako obiekty same w sobie.

Więc za pomocą CompletabeFuture<T> niby to samo, co przy użyciu CompletionStage<T> ale ten może być wykorzystany jako interfejs bazowy dla ewentualnych nowych klas w przyszłości, jak również jest typ docelowy dla wielu typów malejąco jak mamy tendencję do do List<Integer> integerList = new ArrayList<>(); zamiast ArrayList<Integer> integerList = new ArrayList<>();

możesz przeczytać pozycję introduction to CompletionStage and CompletableFuture, aby uzyskać więcej informacji.

+0

Myślę, że po raz pierwszy jest jak różnica między klasą "Wątek" i interfejsem "Runnable", więc istnieje więcej metod do wykorzystania, ale jeszcze więcej, które przyniosą korzyści, gdy zdefiniuję pole typu 'CompletableFuture ' zamiast zwracania wartości za pomocą metody. –

+0

@EbraheemAlrabee Interfejs 'CompletionStage' zawiera proste metody obliczeń, które mogą ale nie muszą być asynchroniczne. tak więc typ _implementing_ prawie zawsze będzie miał większą funkcjonalność niż typ bazowy, więc jak wspomniał Eugene w swoim poście, chyba że używasz innej implementacji tego interfejsu, to prawdopodobnie ma sens użycie 'CompletableFuture ' as typ docelowy _for now_.Jednak w przyszłości może być więcej klas implementacyjnych, nigdy nie wiadomo. –

1

Jedna to interfejs, a druga to klasa. Zwykle zwracasz interfejs, a nie implementację, ale wątpię, aby tak było w tym przypadku. Wracając CompletableFuture ma sens dla mnie.

Jeśli nie używasz, używasz innej implementacji tego interfejsu, na przykład Spring DelegatingCompletableFuture, ale z Twoich przykładów nie.

0

A CompletableFuture to CompletionStage. Jednak, jak sama nazwa wskazuje, jest

  • completable: To może być zakończony za pomocą complete lub completeExceptionally.
  • a Future: Możesz użyć metody get, itp., Aby uzyskać wynik.

IMHO w większości API, podobnie jak w przykładzie, należy użyć CompletionStage, ponieważ

  • Realizacja zwykle zapewnia mechanizm do zakończenia etapu. Nie musisz/chcesz ujawniać dzwoniącemu takich metod, jak complete.
  • Program wywołujący powinien używać zwróconej wartości w sposób asynchroniczny, zamiast blokować połączenia, takie jak get dostarczone przez .
Powiązane problemy