Wann sollten Nullwerte von Boolean verwendet werden?
Lesezeit: 11 Minuten
peter.murray.rust
Java boolean erlaubt Werte von true und false während Boolean es zulässt true, falseund null. Ich habe angefangen meine umzubauen booleans zu Booleans. Dies kann zu Abstürzen in Tests wie z
Boolean set = null;
...
if (set) ...
während der Prüfung
if (set != null && set) ...
wirkt gekünstelt und fehleranfällig.
Wann, wenn überhaupt, ist es sinnvoll, es zu verwenden Booleans mit Nullwerten? Wenn nie, was sind dann die Hauptvorteile des verpackten Objekts?
UPDATE: Es gab so viele wertvolle Antworten, dass ich einige davon in meiner eigenen Antwort zusammengefasst habe. Ich bin bestenfalls ein Fortgeschrittener in Java, also habe ich versucht, die Dinge zu zeigen, die ich nützlich finde. Beachten Sie, dass die Frage “falsch formuliert” ist (Boolean kann nicht “einen Nullwert haben”), aber ich habe sie belassen, falls andere das gleiche Missverständnis haben
Manchmal möchten Sie einen nicht initialisierten Zustand und eine nicht initialisierte Einstellung Boolean variabel zu null hilft.
– nhahtdh
25. Juni 2012 um 7:50 Uhr
“Immer” ist ein bisschen stark, das wage ich nicht zu bestätigen, aber ich würde einen Test dafür erwarten null wenn es wirklich als 3. Zustand verwendet wird.
– nhahtdh
25. Juni 2012 um 7:54 Uhr
Haben Sie einen Grund, Booleans in Booleans umzuwandeln? Ich würde mich an den primitiven Typ halten und ihn nur umschließen, wenn es einen guten Grund dafür gibt, zB wenn ich eine Variable als Referenz übergeben muss.
Es gibt keinen “Nullwert”. in ein boolescher Wert”. A Boolean ein Objekt ist, während a boolean ist ein “Skalar”. Wenn ein Boolean Referenz auf null gesetzt ist, bedeutet dies, dass die entsprechende Boolean Objekt existiert nicht. Du kannst nichts in etwas platzieren, das nicht existiert.
– Heiße Licks
25. Juni 2012 um 18:28 Uhr
JB Niet
Verwenden boolean statt Boolean wann immer du kannst. Dadurch werden viele vermieden NullPointerExceptions und machen Ihren Code robuster.
Boolean ist z.B. sinnvoll
um boolesche Werte in einer Sammlung zu speichern (Liste, Karte usw.)
um einen nullable boolean darzustellen (der beispielsweise aus einer nullable boolean Spalte in einer Datenbank stammt). Der Nullwert könnte in diesem Zusammenhang bedeuten „Wir wissen nicht, ob es wahr oder falsch ist“.
Jedes Mal, wenn eine Methode ein Objekt als Argument benötigt, müssen Sie einen booleschen Wert übergeben. Zum Beispiel beim Einsatz von Reflektion oder Methoden wie MessageFormat.format().
Ihre zweite Kugel ist wirklich der Kern der richtigen Antwort auf diese Frage, denke ich.
– Niels Brinch
25. Juni 2012 um 15:07 Uhr
Eine andere Verwendung für Boolean, die ich hatte, ist als generischer Typparameter beim Erweitern generischer Klassen – eng verwandt mit Punkt 3.
– Alex
25. Juni 2012 um 16:17 Uhr
Das Überladen des Konzepts von null mit einer anderen Bedeutung als „das Universum weiß es nicht“ ist schwächer als die Verwendung einer 3 (oder mehr)-wertigen Aufzählung. Macht das Lesen von Code, der Parameter in die Methode übergibt, auch expliziter.
– blauer Vektor
26. Juni 2012 um 19:08 Uhr
Oder #4: Boolean isSchrodingerCatAlive = null; (sorry, konnte nicht widerstehen ;)).
– Matthias
13. Dezember 2013 um 23:02 Uhr
Tomasz Nurkiewicz
benutze ich fast nie Boolean weil seine Semantik vage und obskur ist. Grundsätzlich haben Sie eine 3-Zustands-Logik: wahr, falsch oder unbekannt. Manchmal ist es nützlich, es zu verwenden, wenn Sie z. B. dem Benutzer die Wahl zwischen zwei Werten gegeben haben und der Benutzer überhaupt nicht geantwortet hat und Sie diese Informationen wirklich wissen möchten (denken Sie an eine NULL-fähige Datenbankspalte).
Ich sehe keinen Grund aus umzusteigen boolean zu Boolean da es zusätzlichen Speicheraufwand, NPE-Möglichkeiten und weniger Eingaben einführt. Normalerweise benutze ich umständlich BooleanUtils.isTrue() um mir das Leben ein bisschen leichter zu machen Boolean.
Der einzige Grund für die Existenz von Boolean ist die Fähigkeit, Sammlungen von zu haben Boolean Typ (Generika erlauben keine booleansowie alle anderen Primitiven).
Es ist jedoch eine externe Bibliothek (Apache Commons).
– nhahtdh
25. Juni 2012 um 7:59 Uhr
Für mehrwertige Logik ist es vorzuziehen, Aufzählungen zu verwenden. Daher sollte Boolean für (Auto)Boxing-Variablen zur Verwendung in Datenstrukturen belassen werden.
– jpe
25. Juni 2012 um 8:03 Uhr
Bei Verwendung von Boolean ist ein praktischer Test, um Nullzeiger-Ausnahmen zu vermeiden Boolean.TRUE.equals(myBooleanObject) oder Boolean.FALSE.equals(myBooleanObject).
– Christoph Peisert
25. Juni 2012 um 8:20 Uhr
Ein boolesches Objekt hat nur zwei Zustände — true und false. null ist nicht ein Zustand des Objekts, sondern eher ein Zustand der Objektreferenz.
– Heiße Licks
25. Juni 2012 um 20:04 Uhr
Überlassen Sie es Apache Commons, zu sagen: “Jemand könnte es vermasseln, boolesche Werte auszuwerten … machen wir eine isTrue() method…”, was wie die dümmste verdammte Sache in der Geschichte der Utility-Funktionen klingt. Und doch ist es irgendwie nützlich… das ist das größte Wtf hier.
– corsiKa
6. Juli 2012 um 16:49 Uhr
Benutzer606723
Wow, was um alles in der Welt? Gehe es nur mir so oder sind all diese Antworten falsch oder zumindest irreführend?
Die Klasse Boolean ist ein Wrapper um den primitiven Typ Boolean. Die Verwendung dieses Wrappers besteht darin, einen booleschen Wert in einer Methode übergeben zu können, die ein Objekt oder ein generisches Objekt akzeptiert. Dh Vektor.
Ein boolesches Objekt kann NIEMALS den Wert null haben. Wenn dein Hinweis zu einem booleschen Wert null ist, bedeutet dies einfach, dass Ihr boolescher Wert nie erstellt wurde.
Eine boolesche Nullreferenz sollte nur verwendet werden, um eine ähnliche Logik auszulösen, zu der Sie eine andere Nullreferenz haben. Die Verwendung für Drei-Zustands-Logik ist ungeschickt.
Vielleicht kommt daher ein Großteil der Verwirrung.
EDIT2: Bitte lesen Sie die Kommentare unten. Wenn jemand eine Idee hat, wie ich meine Antwort umstrukturieren kann, um dies zu integrieren, tun Sie dies bitte.
Ich verstehe Ihre Aussage “Ein boolescher Wert kann NIE einen Wert von null haben” nicht. Ich kann einen booleschen Wert erstellen (Boolean a = true;) und dann a auf null setzen (a = null;). Es ist vielleicht nicht elegant oder weise, aber es ist möglich.
– peter.murray.rust
25. Juni 2012 um 14:51 Uhr
Wenn Sie das tun Boolean a; a ist ein Zeiger auf ein boolesches Objekt. Wenn du a = null; Sie haben Ihren booleschen Wert nicht auf null gesetzt, Sie haben Ihre Referenz auf null gesetzt. Tun Boolean a = null; a.booleanValue(); In diesem Fall Sie noch nie erstellt ein boolesches Objekt und löst daher eine NullpointerException aus. Lassen Sie mich wissen, wenn Sie weitere Anweisungen benötigen.
– Benutzer606723
25. Juni 2012 um 14:59 Uhr
Außerdem, wenn Sie es tun Boolean a = true;Es macht eine Art Magie, die tatsächlich so interpretiert wird Boolean a = new Boolean(true); Das ist wahrscheinlich aus Performance-Gründen nicht ganz richtig, aber man muss sich darüber im Klaren sein, dass der Boolesche Wert immer noch ein Objekt ist.
– Benutzer606723
25. Juni 2012 um 15:04 Uhr
@missingno, jeder Code, der sich mit einem Objekt befasst, muss damit umgehen. Eine Objektreferenz kann entweder null sein oder nicht. Dies ist kein Sonderfall und bedarf keiner besonderen Betrachtung.
– Benutzer606723
25. Juni 2012 um 16:54 Uhr
Du verfehlst meinen Punkt @missingno. Ich stimme zu, dass wir Nullreferenzwerte berücksichtigen müssen. Ich habe nie dagegen argumentiert. Aber wir müssen dies tun JEDER OBJEKTVERWEIS. Eine Null-Boolean-Referenz ist kein Sonderfall. Daher müssen Null-Boolesche Referenzwerte nicht besonders berücksichtigt werden.
– Benutzer606723
25. Juni 2012 um 20:34 Uhr
Es gibt drei schnelle Gründe:
um boolesche Datenbankwerte darzustellen, die sein können true, false oder null
zur Darstellung von XML-Schemas xsd:boolean deklarierte Werte mit xsd:nillable="true"
um generische Typen verwenden zu können: List<Boolean> – Sie können nicht verwenden List<boolean>
peter.murray.rust
ANTWORT AUF EIGENE FRAGE: Ich dachte, es wäre nützlich, meine eigene Frage zu beantworten, da ich viel aus den Antworten gelernt habe. Diese Antwort soll denen helfen – wie mir – die die Probleme nicht vollständig verstehen. Wenn ich eine falsche Sprache verwende, korrigieren Sie mich bitte.
Der null “Wert” ist kein Wert und unterscheidet sich grundlegend von true und false. Es ist das Fehlen eines Zeigers auf Objekte. Daher ist es grundlegend falsch zu glauben, dass Boolean 3-wertig ist
Die Syntax für Boolean ist abgekürzt und verschleiert, dass die Referenz auf Objects zeigt:
Boolean a = true;
verschweigt die Tatsache, dass true ist ein Objekt. Andere gleichwertige Aufgaben könnten sein:
Boolean a = Boolean.TRUE;
oder
Boolean a = new Boolean(true);
Die abgekürzte Syntax
if (a) ...
unterscheidet sich von den meisten anderen Zuweisungen und verschleiert die Tatsache, dass a eine Objektreferenz oder ein Primitiv sein kann. Wenn ein Objekt getestet werden muss null NPE zu vermeiden. Für mich ist es psychologisch einfacher, sich das zu merken, wenn es einen Gleichheitstest gibt:
if (a == true) ...
wo wir möglicherweise aufgefordert werden, auf null zu testen. Die verkürzte Form ist also nur sicher, wenn a ist ein Primitiv.
Für mich habe ich jetzt die Empfehlungen:
Verwenden Sie niemals null für eine dreiwertige Logik. Verwenden Sie nur wahr und falsch.
Niemals zurückkehren Boolean von einer Methode, wie es sein könnte null. Nur zurück boolean.
Benutz nur Boolean zum Einschließen von Elementen in Container oder Argumente für Methoden, bei denen Objekte erforderlich sind
Verwenden Sie nicht “new Boolean(whatever)”. Dadurch wird ein neuer boolescher Wert auf dem Heap instanziiert. Boolean ist jedoch unveränderlich. Verwenden Sie “Boolean.valueOf(whatever)”, wodurch eine Referenz erstellt wird, die entweder auf Boolean.TRUE oder Boolean.False zeigt, je nachdem, was auch immer.
– simbo1905
1. Juli 2012 um 21:43 Uhr
Eines der vielen Probleme mit Java (IMHO nach 12 Jahren) ist die Inkonsistenz der Herangehensweise an Nullwerte, die auch alte Sprachen haben. Wenn Sie sich Scala ansehen, hat es das Konzept einer typisierten Option, die null sein oder einen Wert haben kann (Unterklassen None oder Some). Dann können Sie myOption.getOrElse(defaultValue) aufrufen. Sehen scala-lang.org/api/current/scala/Option.html Diese Funktion ist nicht komplex. Da es jedoch in die neue JVM-Sprache integriert ist, wird es von vielen Bibliotheken verwendet. Dadurch „repariert“ scale einige der Java-Probleme des „letzten Jahrhunderts“, kompiliert aber immer noch in Klassendateien, die auf der JRE ausgeführt werden.
– simbo1905
1. Juli 2012 um 21:49 Uhr
Wrapper-Klassen für Primitive können dort verwendet werden, wo Objekte benötigt werden, Sammlungen sind ein gutes Beispiel.
Stellen Sie sich vor, Sie müssen aus irgendeinem Grund eine Sequenz von speichern boolean in einem (n ArrayListdies kann durch Boxen erfolgen boolean in Boolean.
Wie jeder Java-Programmierer weiß, können Sie kein int (oder einen anderen primitiven Wert) in eine Sammlung einfügen. Sammlungen können nur Objektreferenzen enthalten, daher müssen Sie primitive Werte in die entsprechende Wrapper-Klasse (die im Fall von int Integer ist) einpacken. Wenn Sie das Objekt aus der Sammlung nehmen, erhalten Sie die eingegebene Ganzzahl; Wenn Sie einen Int benötigen, müssen Sie den Integer mit der Methode intValue auspacken. All dieses Boxen und Unboxing ist mühsam und bringt Ihren Code durcheinander. Die Autoboxing- und Unboxing-Funktion automatisiert den Vorgang und eliminiert den Schmerz und die Unordnung.
Verwenden Sie nicht “new Boolean(whatever)”. Dadurch wird ein neuer boolescher Wert auf dem Heap instanziiert. Boolean ist jedoch unveränderlich. Verwenden Sie “Boolean.valueOf(whatever)”, wodurch eine Referenz erstellt wird, die entweder auf Boolean.TRUE oder Boolean.False zeigt, je nachdem, was auch immer.
– simbo1905
1. Juli 2012 um 21:43 Uhr
Eines der vielen Probleme mit Java (IMHO nach 12 Jahren) ist die Inkonsistenz der Herangehensweise an Nullwerte, die auch alte Sprachen haben. Wenn Sie sich Scala ansehen, hat es das Konzept einer typisierten Option, die null sein oder einen Wert haben kann (Unterklassen None oder Some). Dann können Sie myOption.getOrElse(defaultValue) aufrufen. Sehen scala-lang.org/api/current/scala/Option.html Diese Funktion ist nicht komplex. Da es jedoch in die neue JVM-Sprache integriert ist, wird es von vielen Bibliotheken verwendet. Dadurch „repariert“ scale einige der Java-Probleme des „letzten Jahrhunderts“, kompiliert aber immer noch in Klassendateien, die auf der JRE ausgeführt werden.
– simbo1905
1. Juli 2012 um 21:49 Uhr
Boolean Wrapper ist nützlich, wenn Sie wissen möchten, ob ein Wert zugewiesen wurde oder nicht true und false. Es hat die folgenden drei Zustände:
WAHR
FALSCH
Nicht definiert, was ist null
Wohingegen boolean hat nur zwei Zustände:
WAHR
FALSCH
Der obige Unterschied macht es hilfreich in Listen von Boolean Werte, die haben können True, False oder Null.
Nein, es hat keinen Nullzustand, das ist die Referenz.
– Matsemann
25. Juni 2012 um 21:07 Uhr
Was ich meinte, war, dass Bolean für definiertes Wahr/Falsch und Nicht definiert verwendet werden kann.
– Ramesh PVK
26. Juni 2012 um 4:36 Uhr
13457100cookie-checkWann sollten Nullwerte von Boolean verwendet werden?yes
Manchmal möchten Sie einen nicht initialisierten Zustand und eine nicht initialisierte Einstellung
Boolean
variabel zunull
hilft.– nhahtdh
25. Juni 2012 um 7:50 Uhr
“Immer” ist ein bisschen stark, das wage ich nicht zu bestätigen, aber ich würde einen Test dafür erwarten
null
wenn es wirklich als 3. Zustand verwendet wird.– nhahtdh
25. Juni 2012 um 7:54 Uhr
Haben Sie einen Grund, Booleans in Booleans umzuwandeln? Ich würde mich an den primitiven Typ halten und ihn nur umschließen, wenn es einen guten Grund dafür gibt, zB wenn ich eine Variable als Referenz übergeben muss.
– jpe
25. Juni 2012 um 7:58 Uhr
Vielleicht möchten Sie sich auch das ansehen: thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx
– Bizilop
25. Juni 2012 um 10:26 Uhr
Es gibt keinen “Nullwert”. in ein boolescher Wert”. A
Boolean
ein Objekt ist, während aboolean
ist ein “Skalar”. Wenn einBoolean
Referenz auf null gesetzt ist, bedeutet dies, dass die entsprechendeBoolean
Objekt existiert nicht. Du kannst nichts in etwas platzieren, das nicht existiert.– Heiße Licks
25. Juni 2012 um 18:28 Uhr