Costrutto future
Future è un costrutto usato per recuperare il risultato di un’operazione concorrente e che quindi potrebbe non essere ancora disponibile quando si cerca di accedervi; in pratica è una sorta di “placeholder”/segnaposto, creato per un valore(solitamente il risultato di una computazione) che potrebbe diventare disponibile. A questo risultato ci si può accedere in maniera sincrona, e quindi bloccante (da evitare il più possibile), o asincrona e quindi non bloccante.
Si dice completato(“completed”) se ha prodotto un risultato che sia un valore o un’eccezione, altrimenti si dice non completato(“not completed”); se è completato con un valore il future è completato con successo(“successfully completed”), se invece è completato con un’eccezione generata dalla computazione allora si dice fallito(“failed”)
Un future può essere assegnato una volta sola, dal momento in cui gli viene assegnato un valore o un’eccezione, diventa di fatto immutabile e non potrà essere sovrascritto.
Per creare un future possiamo utilizzare il metodo apply
del “companion-object” che richiede due argomenti come input: body
(il codice da eseguire nel future) e l’ ExecutionContext
che è implicito:
object Future { def apply[T](body: => T)(implicit execctx: ExecutionContext): Future[T] }