Non utilizzare null, utilizzare Opzionale
Come hai sottolineato, uno dei maggiori problemi nulldi Java è che può essere utilizzato ovunque , o almeno per tutti i tipi di riferimento.
È impossibile dire che potrebbe essere nulle 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 Optionals:
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.OptionalGoogle 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 nullvalore.
D'altra parte, se nullpotrebbe essere usato e significhi qualcosa, assicurati di usarlo.
Alla fine, ovviamente, non è possibile rimuovere nullda Java. Consiglio vivamente di sostituire l' Optionalastrazione ogni volta che è possibile e di controllare nullquelle altre volte che puoi fare qualcosa di ragionevole al riguardo.