Должен ли API возвращать CompletionStage или CompletableFuture

При создании API рекомендуется кодировать интерфейс, поэтому кажется, что возврат CompletionStage кажется лучшим подходом. Однако я понял, что всегда вызываю .toCompletableFuture после получения CompletionStage. Каков рекомендуемый подход в этом случае?


person user_1357    schedule 26.01.2017    source источник
comment
Это зависит от того, почему вы всегда звоните toCompletableFuture()  -  person Holger    schedule 26.01.2017
comment
@Holger Можете ли вы рассказать об этом подробнее? Мы вызываем toCompletableFuture, чтобы мы могли вызывать методы, которые доступны только в нем. Это немного сбивает с толку, где мы можем получить конкретный экземпляр из интерфейса. Они тесно связаны между собой и не позволяют использовать интерфейс.   -  person user_1357    schedule 31.01.2017
comment
Итак, CompletionStage определяет 38 методов, интерфейс Future определяет еще пять. Если вам постоянно («всегда») нужны оставшиеся восемь, CompletableFuture специфических методов, кодирование для интерфейса действительно не для вас.   -  person Holger    schedule 31.01.2017


Ответы (2)


См. мой ответ на странице https://stackoverflow.com/a/49158702/1113842.

Как и спросил Хольгер, почему вы звоните toCompletableFuture?

  • Вы хотите, чтобы звонящий complete/cancel это? Большинство приложений предоставляют собственные механизмы прохождения этапа. Таким образом, нет необходимости раскрывать эти методы.
  • Вы хотите использовать блокировку get? Этого следует избегать в асинхронном программировании.

Если ответы на оба вопроса отрицательные, следует вернуть CompletionStage.

person Xiao    schedule 07.03.2018

API, использующий CompletionStage, предназначен для неблокирующего использования, поэтому вызов .toCompletableFuture() требуется только в том случае, если вызывающий объект не работает неблокирующим образом. Если API не является неблокирующим, он должен возвращать простой старый интерфейс Future.

person Konstantin Pelepelin    schedule 09.08.2017
comment
См. также вопрос с обратной точки зрения stackoverflow.com/q/34930840/1531945 - person Konstantin Pelepelin; 09.08.2017