2017-01-26 4 views
2

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

+0

Это зависит от * почему * вы всегда вызываете 'toCompletableFuture()' ... – Holger

+0

@Holger Можете ли вы подробно остановиться на этом? Мы вызываем toCompletableFuture, чтобы мы могли вызывать методы, которые доступны только в нем. Это немного запутывает, когда мы можем получить конкретный пример из интерфейса. Они тесно связаны и побеждают цель иметь интерфейс. – Mayumi

+0

Ну, 'CompletionStage' определяет 38 методов, интерфейс' Future' определяет еще пять. Если вы постоянно («всегда») нуждаетесь в оставшихся восьми, специальных методах «CompletableFuture», кодирование с интерфейсом действительно не для вас. – Holger

ответ

2

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

+0

См. Также вопрос с обратной стороны https://stackoverflow.com/q/34930840/1531945 –

0

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

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

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

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

Смежные вопросы