2015-07-29 14 views
116

Quando si utilizza la classe Java 8 Optional, ci sono due modi in cui un valore può essere incluso in un opzionale.Perché utilizzare Optional.of su Optional.ofNullable?

String foobar = <value or null>; 
Optional.of(foobar);   // May throw NullPointerException 
Optional.ofNullable(foobar); // Safe from NullPointerException 

Capisco Optional.ofNullable è l'unico modo sicuro di usare Optional, ma perché Optional.of esistono affatto? Perché non usare solo lo Optional.ofNullable e essere sempre al sicuro?

+1

per favore dimmi quale pacchetto deve importare per usare questo? – LoveToCode

+2

@LoveToCode 'java.util.Optional' - È disponibile se stai usando JDK 8 o successivo – whirlwin

risposta

154

La domanda è basata sul presupposto che il codice che può generare NullPointerException è peggiore del codice che potrebbe non. Questa ipotesi è sbagliata. Se si prevede che il proprio foobar non sia mai nullo a causa della logica del programma, è molto meglio usare Optional.of(foobar) poiché verrà visualizzato uno NullPointerException che indicherà che il programma ha un bug. Se si utilizza Optional.ofNullable(foobar) e foobar corrisponde a null a causa del bug, il programma continuerà silenziosamente a funzionare in modo errato, il che potrebbe essere un disastro più grande. In questo modo un errore potrebbe verificarsi molto più tardi e sarebbe molto più difficile capire a che punto è andato storto.

+47

" * Se ti aspetti che il tuo foobar non sia mai nullo a causa della logica del programma, è molto meglio usare 'Optional.of (foobar) '*". Questo sembra un po 'strano - quando sappiamo che il valore non sarà 'nullo' in ogni caso, allora perché non usare il valore stesso, invece di avvolgerlo in un' Opzionale'? –

+27

@kocko, potrebbe essere necessario restituire il 'Optional' dal metodo come richiesto dall'interfaccia che si sta implementando (probabilmente altri implementatori potrebbero restituire un opzionale vuoto). O vuoi creare una raccolta/flusso di optionals, alcuni dei quali sono garantiti non nulli e altri no. Oppure hai una logica condizionale che crea un optional in più rami e in un singolo ramo sei sicuro che non sia nullo. –

+19

Perché facoltativo significa che può essere presente o assente. Assente! = Null. 'null' in questo caso significa" Mi aspetto che il foobar sia presente, ma a causa di un bug è nullo ". 'Optional.isPresent() == false' significa che foobar non è presente, cioè questo è previsto, comportamento legittimo. – Buurman

Problemi correlati