Un Optional
porta una digitazione più strong in operazioni che possono fallire, come le altre risposte hanno coperto, ma questo è lontano dalla cosa più interessante o di valore Optionals
da portare alla tabella. Molto più utile è la possibilità di ritardare o evitare il controllo di errori e di comporre facilmente molte operazioni che potrebbero fallire.
Considera se hai avuto la tua variabile optional
dal codice di esempio, quindi hai dovuto eseguire due passaggi aggiuntivi che ognuno potrebbe potenzialmente fallire. Se un passaggio lungo il percorso non riesce, si desidera invece restituire un valore predefinito. Usando Optionals
correttamente, si finisce con qualcosa di simile:
return optional.flatMap(x -> x.anotherOptionalStep())
.flatMap(x -> x.yetAnotherOptionalStep())
.orElse(defaultValue);
Con null
avrei dovuto controllare tre volte per null
prima di procedere, il che aggiunge un sacco di complessità e problemi di manutenzione al codice. Optionals
ha quel controllo integrato nelle funzioni flatMap
e orElse
.
Nota Non ho chiamato isPresent
una volta, che dovresti pensare a un odore di codice quando usi Optionals
. Questo non significa necessariamente che mai usi isPresent
, solo che dovresti controllare pesantemente qualsiasi codice che faccia, per vedere se c'è un modo migliore. Altrimenti, hai ragione, stai ricevendo un vantaggio sulla sicurezza di tipo marginale rispetto all'utilizzo di null
.
Si noti inoltre che non sono così preoccupato di incapsulare tutto questo in un'unica funzione, al fine di proteggere altre parti del mio codice dai puntatori nulli dai risultati intermedi. Se ha più senso avere il mio .orElse(defaultValue)
in un'altra funzione, ad esempio, ho molti meno problemi a metterlo lì, ed è molto più facile comporre le operazioni tra le diverse funzioni, se necessario.