Test mit der Boolean-Wrapper-Klasse
Im vorherigen Schritt haben wir mit dem primitiven boolean
-Typ gearbeitet. Java verfügt auch über eine entsprechende Wrapper-Klasse namens Boolean
. Wrapper-Klassen bieten eine Möglichkeit, primitive Datentypen als Objekte zu verwenden. Dies ist besonders nützlich, wenn Sie mit Sammlungen (Collections) arbeiten oder wenn Sie einen booleschen Wert darstellen müssen, der möglicherweise null
sein kann.
Die Boolean
-Klasse verfügt über zwei vordefinierte Objekte für die booleschen Werte: Boolean.TRUE
und Boolean.FALSE
. Dies sind konstante Objekte, die die booleschen Werte true
und false
darstellen.
Wenn Sie mit Boolean
-Objekten arbeiten, können Sie immer noch den Gleichheitsoperator ==
verwenden, um sie zu vergleichen. Es ist jedoch wichtig zu verstehen, wie ==
mit Objekten funktioniert. Bei Objekten prüft ==
, ob die beiden Variablen auf dasselbe exakte Objekt im Speicher verweisen, nicht nur, ob sie denselben Wert haben.
Ändern wir unser Programm, um die Boolean
-Wrapper-Klasse zu verwenden und zu sehen, wie sich der Gleichheitsoperator verhält.
-
Öffnen Sie die Datei HelloJava.java
im WebIDE-Editor.
-
Ersetzen Sie den Code durch folgenden:
public class HelloJava {
public static void main(String[] args) {
Boolean isJavaFunObject = Boolean.TRUE;
if (isJavaFunObject == Boolean.TRUE) {
System.out.println("Java is fun (using Boolean.TRUE)!");
} else {
System.out.println("Java is not fun (using Boolean.TRUE).");
}
Boolean anotherBooleanObject = true; // Autoboxing
if (anotherBooleanObject == Boolean.TRUE) {
System.out.println("Another boolean object is true!");
} else {
System.out.println("Another boolean object is not true.");
}
}
}
Schauen wir uns die Änderungen an:
Boolean isJavaFunObject = Boolean.TRUE;
: Wir deklarieren eine Variable vom Typ Boolean
und weisen ihr die Konstante Boolean.TRUE
zu.
if (isJavaFunObject == Boolean.TRUE)
: Wir verwenden den Gleichheitsoperator ==
, um unser Boolean
-Objekt mit der Konstante Boolean.TRUE
zu vergleichen. Da isJavaFunObject
Boolean.TRUE
zugewiesen ist, verweisen sie auf dasselbe Objekt, daher wird diese Bedingung true
sein.
Boolean anotherBooleanObject = true;
: Diese Zeile demonstriert "Autoboxing". Java konvertiert automatisch den primitiven boolean
-Wert true
in ein Boolean
-Objekt.
if (anotherBooleanObject == Boolean.TRUE)
: Wir verwenden erneut ==
, um anotherBooleanObject
mit Boolean.TRUE
zu vergleichen. Aufgrund der Funktionsweise des Autoboxing und der Zwischenspeicherung (Caching) von Boolean
-Werten in Java verweisen die automatisch verpackten Boolean
-Objekte für die Werte true
und false
oft auf dieselben zwischengespeicherten Instanzen wie Boolean.TRUE
und Boolean.FALSE
. Daher wird diese Bedingung ebenfalls wahrscheinlich true
sein.
-
Speichern Sie die Datei.
-
Kompilieren Sie das Programm:
javac HelloJava.java
-
Führen Sie das Programm aus:
java HelloJava
Sie sollten die folgende Ausgabe sehen:
Java is fun (using Boolean.TRUE)!
Another boolean object is true!
Dies bestätigt, dass die Verwendung von ==
mit Boolean.TRUE
in diesen Fällen wie erwartet funktioniert, da die Variablen wahrscheinlich auf dasselbe zugrunde liegende Boolean.TRUE
-Objekt verweisen.
Allerdings kann das Verlassen auf ==
für den Vergleich von Boolean
-Objekten in komplexeren Szenarien riskant sein, insbesondere wenn die Boolean
-Objekte auf verschiedene Weise erstellt wurden oder aus verschiedenen Quellen stammen. Ein sichererer und empfohlener Weg, um Boolean
-Objekte auf Wertgleichheit zu vergleichen, ist die Verwendung der .equals()
-Methode.
Ändern wir den Code, um .equals()
zu verwenden.
-
Öffnen Sie HelloJava.java
im Editor.
-
Ändern Sie die if
-Anweisungen, um .equals()
zu verwenden:
public class HelloJava {
public static void main(String[] args) {
Boolean isJavaFunObject = Boolean.TRUE;
if (isJavaFunObject.equals(Boolean.TRUE)) {
System.out.println("Java is fun (using equals)!");
} else {
System.out.println("Java is not fun (using equals).");
}
Boolean anotherBooleanObject = true; // Autoboxing
if (anotherBooleanObject.equals(Boolean.TRUE)) {
System.out.println("Another boolean object is true (using equals)!");
} else {
System.out.println("Another boolean object is not true (using equals).");
}
}
}
Wir haben == Boolean.TRUE
durch .equals(Boolean.TRUE)
ersetzt. Die .equals()
-Methode vergleicht den Wert der Objekte, nicht ihre Speicheradresse.
-
Speichern Sie die Datei.
-
Kompilieren Sie das Programm:
javac HelloJava.java
-
Führen Sie das Programm aus:
java HelloJava
Sie sollten die folgende Ausgabe sehen:
Java is fun (using equals)!
Another boolean object is true (using equals)!
Die Verwendung von .equals()
ist der Standard und der sicherste Weg, um Boolean
-Objekte auf Wertgleichheit zu vergleichen.
Zusammenfassend lässt sich sagen, dass ==
zwar aufgrund der Zwischenspeicherung (Caching) für den Vergleich von Boolean
-Objekten mit Boolean.TRUE
funktionieren kann, aber die .equals()
-Methode die bevorzugte und zuverlässigere Möglichkeit ist, um zu prüfen, ob ein Boolean
-Objekt den Wert true
repräsentiert.