Non utilizzare null, utilizzare Opzionale
Come hai sottolineato, uno dei maggiori problemi null
di Java è che può essere utilizzato ovunque , o almeno per tutti i tipi di riferimento.
È impossibile dire che potrebbe essere null
e cosa non potrebbe essere.
Java 8 introduce un modello molto migliore: Optional
.
Ed esempio da Oracle:
String version = "UNKNOWN";
if(computer != null) {
Soundcard soundcard = computer.getSoundcard();
if(soundcard != null) {
USB usb = soundcard.getUSB();
if(usb != null) {
version = usb.getVersion();
}
}
}
Se ognuno di questi può restituire o meno un valore positivo, puoi modificare le API in Optional
s:
String name = computer.flatMap(Computer::getSoundcard)
.flatMap(Soundcard::getUSB)
.map(USB::getVersion)
.orElse("UNKNOWN");
Codificando esplicitamente l'opzione nel tipo, le tue interfacce saranno molto migliori e il tuo codice sarà più pulito.
Se non stai utilizzando Java 8, puoi consultare com.google.common.base.Optional
Google Guava.
Una buona spiegazione da parte del team di Guava: https://github.com/google/guava/wiki/UsingAndAvoidingNullExplained
Una spiegazione più generale degli svantaggi di null, con esempi in diverse lingue: https://www.lucidchart.com/techblog/2015/08/31/the-worst-mistake-of-computer-science/
@Nonnull, @Nullable
Java 8 aggiunge queste annotazioni per aiutare gli strumenti di controllo del codice come IDE a rilevare i problemi. Sono abbastanza limitati nella loro efficacia.
Controlla quando ha senso
Non scrivere il 50% del tuo codice controllando null, in particolare se non c'è nulla di ragionevole che il tuo codice possa fare con un null
valore.
D'altra parte, se null
potrebbe essere usato e significhi qualcosa, assicurati di usarlo.
Alla fine, ovviamente, non è possibile rimuovere null
da Java. Consiglio vivamente di sostituire l' Optional
astrazione ogni volta che è possibile e di controllare null
quelle altre volte che puoi fare qualcosa di ragionevole al riguardo.