Verwenden Sie nicht null, sondern optional
Wie Sie bereits betont haben, besteht eines der größten Probleme null
in Java darin, dass es überall oder zumindest für alle Referenztypen verwendet werden kann.
Es ist unmöglich zu sagen, dass das sein könnte null
und was nicht sein könnte.
Java 8 bietet eine viel bessere Muster: Optional
.
Und ein Beispiel von Oracle:
String version = "UNKNOWN";
if(computer != null) {
Soundcard soundcard = computer.getSoundcard();
if(soundcard != null) {
USB usb = soundcard.getUSB();
if(usb != null) {
version = usb.getVersion();
}
}
}
Wenn jeder dieser Werte einen erfolgreichen Wert zurückgibt oder nicht, können Sie die APIs in Optional
s ändern :
String name = computer.flatMap(Computer::getSoundcard)
.flatMap(Soundcard::getUSB)
.map(USB::getVersion)
.orElse("UNKNOWN");
Durch die explizite Codierung von Optionalität im Typ werden Ihre Schnittstellen viel besser und Ihr Code wird sauberer.
Wenn Sie nicht Java 8 verwenden, können Sie com.google.common.base.Optional
in Google Guava nachsehen .
Eine gute Erklärung vom Guava-Team: https://github.com/google/guava/wiki/UsingAndAvoidingNullExplained
Eine allgemeinere Erklärung der Nachteile gegen Null mit Beispielen aus mehreren Sprachen: https://www.lucidchart.com/techblog/2015/08/31/the-worst-mistake-of-computer-science/
@Nonnull, @Nullable
Java 8 fügt diese Annotation hinzu, um Tools zur Codeüberprüfung wie IDEs beim Erkennen von Problemen zu unterstützen. Sie sind in ihrer Wirksamkeit ziemlich begrenzt.
Prüfen Sie, wann es Sinn macht
Schreiben Sie nicht 50% Ihres Codes und überprüfen Sie null, insbesondere wenn es nichts Sinnvolles gibt, das Ihr Code mit einem null
Wert tun kann.
Auf der anderen Seite sollten Sie null
sicherstellen, dass Sie etwas verwenden , wenn es verwendet werden könnte und etwas bedeutet.
Letztendlich kann man null
Java natürlich nicht entfernen . Ich empfehle nachdrücklich, die Optional
Abstraktion zu ersetzen, wann immer dies möglich ist, und zu überprüfen null
, ob Sie in anderen Fällen etwas Vernünftiges tun können.