In Java 8, è meglio per l'interfaccia o la classe astratta definire le API restituendo CompletableFuture
invece di restituire Future
? Considerando lo it is ugly converting Future
to CompletableFuture
e il fatto che lo CompletableFuture
darà al chiamante una maggiore flessibilità nell'utilizzo diretto dello stile funzionale, quale potrebbe essere una buona ragione per un'API per restituire semplicemente Future
?Devo restituire CompletableFuture o Future quando definisco l'API?
7
A
risposta
3
I miei 2 cts:
- restituendo un futuro, si tengono aperte le opzioni e possono restituire un futuro, o un CompletableFuture - non fa alcuna differenza dal punto di vista del chiamante.
- restituendo un CompletableFuture, offri al chiamante più opzioni (ottengono più metodi) ma ti impegni anche a restituire quel tipo di Future - se in due anni ti rendi conto che restituire un BetterFuture avrebbe più senso, dovrai cambia l'API, che non è buona.
Quindi dovresti probabilmente valutare la probabilità che tu voglia restituire qualcosa di diverso da un CompletableFuture in futuro (haha) e decidere di conseguenza.
1
ho pensato di tornare in questo e fornire alcuni aggiornamenti sulle mie decisioni finali:
Per il mio proprio codice/design, sono andato con l'utilizzo CompletableFuture
come tipo di ritorno, perché
- questo è un metodo
protected abstract
di una parte interna che voglio rendere estendibile; - Non ho bisogno di un'interfaccia per definire il binding;
- lo scopo principale di questo tipo di ritorno è un futuro (per IO asincrono), personalmente ritengo che l'API in stile funzionale fornita da
CompletableFuture
rappresenti un ulteriore vantaggio/promemoria/incoraggiamento dell'uso dello stile funzionale per gli sviluppatori futuri.
Con questo detto, avrei sicuramente utilizzare l'interfaccia CompletableStage
come tipo di ritorno, se fossi stato la progettazione di un'API pubblica, perché:
- ciò @assylias e @Holger detto di interfaccia vs. capacità di realizzazione e concatenamento
- e il fatto che
CompletableStage
ha un metodoCompletableFuture<T> toCompletableFuture()
.
Problemi correlati
- 1. Return CompletableFuture <Void> o CompletableFuture <?>?
- 2. Devo usare val o def quando definisco un flusso?
- 3. Devo restituire List o ArrayList
- 4. CompletableFuture da Callable?
- 5. Devo restituire null o generare un'eccezione?
- 6. Devo attivare il gestore di segnali predefinito quando definisco il mio gestore?
- 7. CompletableFuture supplyAsync
- 8. Devo restituire un array o una collezione da una funzione?
- 9. Devo conservare o autorelease prima di restituire oggetti?
- 10. CompletableFuture: in attesa del primo ritorno normale?
- 11. Devo restituire "render" in Grails?
- 12. Devo preparare il mio codice per le modifiche future?
- 13. Cosa devo restituire in presentationIndexForPageViewController: per UIPageViewControllerDataSource?
- 14. Comportamento sorprendente di Java 8 CompletableFuture eccezionalmente metodo
- 15. Quando devo implementare IDisposable?
- 16. Quando devo dichiarare session_start() ;?
- 17. Quando devo sostituire toString()?
- 18. Errore di codifica durante l'utilizzo dell'autenticazione Devd di LAPI
- 19. Devo usare la codifica Base64 o il byte [] per restituire dati binari nel servizio web .NET
- 20. DAL Future Proof
- 21. CompletableFuture/parallelStream in server app JavaEE
- 22. future sul clojure
- 23. Gestione degli errori Scala: Future For Comprensione
- 24. Quando devo implementare __call__
- 25. Task/future in Ruby
- 26. Un gestore di eccezioni è passato a CompletableFuture.exceptionally() deve restituire un valore significativo?
- 27. Problema "MyType": Devo usare tipi astratti (o generici) in Scala per restituire la classe effettiva?
- 28. Quando ManualResetEvent.Set() può restituire false?
- 29. Devo usare typeclass o no?
- 30. Devo usare MapView o MapFragment
Ho appena fatto questa domanda 2 minuti fa e 1 voto ravvicinato già? Cosa c'è di sbagliato nel chiedere casi d'uso reali per le scelte di programmazione/progettazione? – derrdji
Direi che è un po 'largo. Forse aggiungere ciò che è il caso d'uso? –
Il caso di utilizzo è che sto progettando un'API asincrona che elabora l'elaborazione dei file, le mie passate conoscenze mi dicono di restituire Future, ma dopo aver appreso dall'altra domanda SO che ho collegato, sento che Java8 mi sta dicendo di restituire CompletableFuture . Non sono sicuro e ho bisogno di aiuto. –
derrdji