Verwenden von Optional für Null-Sicherheit
Im vorherigen Schritt haben wir gelernt, wie man NullPointerException
verhindern kann, indem man explizit prüft, ob ein Objekt null
ist, bevor man es verwendet. Obwohl dies effektiv ist, kann es manchmal zu Code führen, der mit Null-Prüfungen überfüllt ist. Java 8 hat die Optional
-Klasse eingeführt, um potenziell null
-Werte auf eine funktionalere und ausdrucksstärkere Weise zu behandeln.
Optional
ist ein Containerobjekt, das einen nicht-null
-Wert enthalten kann oder auch nicht. Wenn ein Wert vorhanden ist, gibt isPresent()
true
zurück und get()
gibt den Wert zurück. Wenn kein Wert vorhanden ist, wird das Objekt als leer angesehen und isPresent()
gibt false
zurück. Das Aufrufen von get()
auf einem leeren Optional
löst eine NoSuchElementException
aus.
Lassen Sie uns unser Beispiel umgestalten, um Optional<Character>
zu verwenden, um die Möglichkeit eines null
-Character
zu behandeln.
-
Öffnen Sie die Datei HelloJava.java
im WebIDE-Editor.
-
Ersetzen Sie den gesamten Inhalt der Datei durch folgenden Code:
import java.util.Optional;
public class HelloJava {
public static void main(String[] args) {
Character myChar = null; // Noch immer potenziell null
// Erstellen Sie ein Optional aus dem potenziell null Character
Optional<Character> optionalChar = Optional.ofNullable(myChar);
// Verwenden Sie Optional-Methoden, um den Wert zu prüfen und zu verarbeiten
if (optionalChar.isPresent() && Character.isLetter(optionalChar.get())) {
System.out.println("myChar is a letter.");
} else {
System.out.println("myChar is not a letter or is null.");
}
// Eine andere Möglichkeit unter Verwendung von Optional's funktionalen Methoden (fortgeschrittener)
// optionalChar.filter(Character::isLetter)
// .ifPresentOrElse(
// c -> System.out.println("myChar is a letter (using Optional methods)."),
// () -> System.out.println("myChar is not a letter or is null (using Optional methods).")
// );
}
}
In diesem Code:
- Wir importieren die
Optional
-Klasse.
- Wir deklarieren immer noch
myChar
als potenziell null
.
Optional<Character> optionalChar = Optional.ofNullable(myChar);
erstellt ein Optional
-Objekt. Optional.ofNullable()
wird verwendet, wenn der Wert null
sein könnte. Wenn myChar
null
ist, wird optionalChar
ein leeres Optional
sein. Wenn myChar
einen Wert hat, wird optionalChar
diesen Wert enthalten.
- Wir verwenden dann
optionalChar.isPresent()
, um zu prüfen, ob das Optional
einen Wert enthält, bevor wir versuchen, ihn mit optionalChar.get()
zu erhalten und ihn an Character.isLetter()
zu übergeben. Dies ist ähnlich wie unsere vorherige Null-Prüfung, verwendet jedoch die Optional
-API.
- Der auskommentierte Abschnitt zeigt eine fortgeschrittenere Möglichkeit,
Optional
mit funktionalen Methoden wie filter
und ifPresentOrElse
zu verwenden, was den Code für bestimmte Szenarien kompakter machen kann. Wir werden uns in diesem Einführungslabor nicht auf diese fortgeschrittene Verwendung konzentrieren, aber es ist gut, sich dessen bewusst zu sein.
-
Speichern Sie die Datei.
-
Kompilieren Sie das Programm:
javac HelloJava.java
-
Führen Sie das Programm aus:
java HelloJava
Die Ausgabe sollte die gleiche wie im vorherigen Schritt sein:
myChar is not a letter or is null.
Dies bestätigt, dass die Verwendung von Optional.ofNullable()
und isPresent()
den Null-Fall korrekt behandelt.
Jetzt ändern wir myChar
in ein nicht-null
-Zeichen, um zu sehen, wie das Programm verhält.
-
Ändern Sie die HelloJava.java
-Datei, um myChar
auf ein Zeichen, zum Beispiel 'A', zu setzen:
import java.util.Optional;
public class HelloJava {
public static void main(String[] args) {
Character myChar = 'A'; // Jetzt hat myChar einen Wert
// Erstellen Sie ein Optional aus dem potenziell null Character
Optional<Character> optionalChar = Optional.ofNullable(myChar);
// Verwenden Sie Optional-Methoden, um den Wert zu prüfen und zu verarbeiten
if (optionalChar.isPresent() && Character.isLetter(optionalChar.get())) {
System.out.println("myChar is a letter.");
} else {
System.out.println("myChar is not a letter or is null.");
}
}
}
-
Speichern Sie die Datei.
-
Kompilieren Sie das Programm:
javac HelloJava.java
-
Führen Sie das Programm aus:
java HelloJava
Diesmal sollte die Ausgabe sein:
myChar is a letter.
Dies zeigt, dass wenn myChar
einen Wert hat, optionalChar.isPresent()
true
zurückgibt und die Character.isLetter()
-Prüfung korrekt durchgeführt wird.
Die Verwendung von Optional
kann Ihren Code lesbarer machen und deutlich anzeigen, wann ein Wert fehlen kann, wodurch die Wahrscheinlichkeit unerwarteter NullPointerException
s verringert wird.