2016-01-21 4 views
7

В Java 8 лучше ли интерфейсу или абстрактному классу определять API, возвращающие CompletableFuture вместо возврата Future? Учитывая it is ugly converting Future to CompletableFuture и тот факт, что CompletableFuture предоставит абоненту большую гибкость в использовании функционального стиля напрямую, что может быть хорошей причиной для API, который просто возвращает Future?Должен ли я возвращать CompletableFuture или Future при определении API?

+0

Я только что задал этот вопрос 2 минуты назад и еще 1 закрыл голосование? Что не так с просьбой о фактических вариантах использования для программирования/выбора дизайна? – derrdji

+0

Я бы предположил, что он немного широк. Может быть, добавить пример использования? –

+0

Вариант использования Я разрабатываю асинхронный API, который обрабатывает файлы, мои прошлые знания говорят мне возвращать Будущее , но после изучения другого вопроса, который я связал, я чувствую, что Java8 говорит мне возвращать CompletableFuture . Я не уверен и нуждаюсь в помощи. – derrdji

ответ

3

Мои 2 карат:

  • по возвращению в будущем, вы сохраняете свои варианты открытыми и могут возвращать будущее, или CompletableFuture - это не имеет никакого значения с точки зрения абонента.
  • , возвращая CompletableFuture, вы предоставляете абоненту больше опций (они получают больше методов), но вы также обязуетесь вернуть этот тип будущего - если через два года вы поймете, что возвращение BetterFuture будет иметь больше смысла, вам придется измените API, что не очень хорошо.

Таким образом, вы должны, вероятно, оценить вероятность того, что вам захочется вернуть что-то другое, чем CompletableFuture в будущем (haha), и принять соответствующее решение.

1

Мысль я хотел бы вернуться к этому и обеспечить некоторые обновления на своих окончательных решениях:

Для моего собственного кода/дизайн, я пошел с использованием CompletableFuture в качестве возвращаемого типа, потому что

  • это a protected abstract метод внутренней части, который я хочу сделать расширяемым;
  • Мне не нужен интерфейс для определения привязки;
  • Основная цель этого типа возврата - это будущее (для async IO), я лично считаю, что функциональный интерфейс API, предоставляемый CompletableFuture, является дополнительным преимуществом/напоминанием/поощрением использования функционального стиля для будущих разработчиков.

С этим сказанным, я бы определенно использовать интерфейс CompletableStage в качестве возвращаемого типа, если бы я проектировал публичного API, потому что:

  • , что @assylias и сказал @Holger о интерфейсной VS. реализации и цепной способности
  • и тот факт, что CompletableStage имеет способ CompletableFuture<T> toCompletableFuture().
Смежные вопросы