Java boolean
ermöglicht Werte true
und false
während Boolean ermöglicht true
, false
und null
. Ich habe begonnen, mein boolean
s in Boolean
s umzuwandeln . Dies kann bei Tests wie z
Boolean set = null;
...
if (set) ...
während des Tests
if (set != null && set) ...
scheint erfunden und fehleranfällig.
Wann, wenn überhaupt, ist es sinnvoll, Boolean
s mit Nullwerten zu verwenden? 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 Intermediate 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 keinen "Nullwert" haben), aber ich habe sie belassen, falls andere das gleiche Missverständnis haben
Boolean
Variablen alsnull
hilfreich.null
wenn es wirklich als 3. Zustand verwendet wird.Boolean
ist ein Objekt, während aboolean
ein "Skalar" ist. Wenn eineBoolean
Referenz auf null gesetzt ist, bedeutet dies, dass das entsprechendeBoolean
Objekt nicht vorhanden ist. Sie können nichts in etwas platzieren, das nicht existiert.Antworten:
Verwenden Sie
boolean
anstattBoolean
jedes Mal, wenn Sie können. Dies vermeidet vieleNullPointerException
s und macht Ihren Code robuster.Boolean
ist zum Beispiel nützlichMessageFormat.format()
.quelle
Boolean isSchrodingerCatAlive = null;
(Entschuldigung, konnte nicht widerstehen;)).Ich benutze es fast nie,
Boolean
weil seine Semantik vage und dunkel ist. Grundsätzlich haben Sie eine 3-Zustands-Logik: wahr, falsch oder unbekannt. Manchmal ist es nützlich, es zu verwenden, wenn Sie dem Benutzer beispielsweise 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 für eine Konvertierung von
boolean
nach,Boolean
da dies zusätzlichen Speicheraufwand, NPE-Möglichkeit und weniger Typisierung mit sich bringt. Normalerweise benutze ich umständlichBooleanUtils.isTrue()
, um mein Leben ein bisschen einfacher zu machenBoolean
.Der einzige Grund für die Existenz von
Boolean
ist die Fähigkeit, Sammlungen vonBoolean
Typ zu haben (Generika erlauben nichtboolean
, ebenso wie alle anderen Grundelemente).quelle
Boolean.TRUE.equals(myBooleanObject)
oder ein praktischer Test zur Vermeidung von NullzeigerausnahmenBoolean.FALSE.equals(myBooleanObject)
.true
undfalse
.null
ist kein Zustand des Objekts, sondern ein Zustand der Objektreferenz.isTrue()
Methode ...", was sich wie das dümmste verdammte Ding in der Geschichte der Utility-Funktionen anhört. Und doch ist es irgendwie nützlich ... das ist das größte WTF hier.Wow, was um alles in der Welt? Ist es nur ich oder sind all diese Antworten falsch oder zumindest irreführend?
Die Boolesche Klasse ist ein Wrapper um den booleschen Primitivtyp. Die Verwendung dieses Wrappers besteht darin, einen Booleschen Wert in einer Methode übergeben zu können, die ein Objekt oder eine generische Methode akzeptiert. Dh Vektor.
Ein Boolesches Objekt darf NIEMALS den Wert null haben. Wenn Ihr Verweis auf einen Booleschen Wert null ist, bedeutet dies einfach, dass Ihr Boolescher Wert nie erstellt wurde.
Dies könnte hilfreich sein: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Boolean.java
Eine boolesche Nullreferenz sollte nur verwendet werden, um eine ähnliche Logik auszulösen, für die Sie eine andere Nullreferenz haben. Die Verwendung für die Drei-Zustands-Logik ist umständlich.
EDIT: Beachten Sie, das
Boolean a = true;
ist eine irreführende Aussage. Dies entspricht wirklich etwas näherem.Boolean a = new Boolean(true);
Siehe Autoboxing hier: http://en.wikipedia.org/wiki/Boxing_%28computer_science%29#AutoboxingVielleicht kommt hier ein Großteil der Verwirrung her.
EDIT2: Bitte lesen Sie die Kommentare unten. Wenn jemand eine Idee hat, wie ich meine Antwort umstrukturieren kann, um dies zu berücksichtigen, tun Sie dies bitte.
quelle
Boolean a = true;
) erstellen und dann einen auf null (a = null;
) setzen. Es mag nicht elegant oder weise sein, aber es ist möglich.Boolean a
; a ist ein Zeiger auf ein Boolesches Objekt. Wenn Siea = null;
Ihren Booleschen Wert nicht auf null gesetzt haben, haben Sie Ihren Verweis auf null gesetzt. HabenBoolean a = null; a.booleanValue();
in diesem Fall Sie nicht einmal erstellt ein Boolean - Objekt und daher wird es eine Nullpointer werfen. Lassen Sie mich wissen, wenn Sie weitere Anweisungen benötigen.Boolean a = true;
, wird eine Art Magie ausgeführt, die tatsächlich als das interpretiert wird.Boolean a = new Boolean(true);
Dies ist aus Leistungsgründen wahrscheinlich nicht vollständig korrekt, aber Sie müssen erkennen, dass der Boolesche Wert immer noch ein Objekt ist.Es gibt drei schnelle Gründe:
true
,false
odernull
xsd:boolean
mit deklarierten Werte des XML-Schemas darzustellenxsd:nillable="true"
List<Boolean>
- Sie können nicht verwendenList<boolean>
quelle
boolean
" (Mind Styling), weil Sie in Oracle normalerweise diechar(1) null
Werte 'T' und 'F' verwenden. So kann es (mit zB Hibernate-Typ-Adapter) null sein :)ANTWORT AUF EIGENE FRAGE: Ich dachte, es wäre nützlich, meine eigene Frage zu beantworten, da ich aus den Antworten viel gelernt habe. Diese Antwort soll denjenigen helfen - wie mir -, die die Probleme nicht vollständig verstehen. Wenn ich eine falsche Sprache verwende, korrigieren Sie mich bitte.
true
undfalse
. Es ist das Fehlen eines Zeigers auf Objekte. Daher ist es grundsätzlich falsch zu glauben, dass Boolean 3-wertig istDie Syntax für Boolean wird abgekürzt und verbirgt die Tatsache, dass die Referenz auf Objekte verweist:
Boolean a = true;
verbirgt die Tatsache, dass
true
es sich um ein Objekt handelt. Andere äquivalente Aufgaben könnten sein:oder
Die abgekürzte Syntax
if (a) ...
unterscheidet sich von den meisten anderen Zuordnungen und verbirgt die Tatsache, dass a eine Objektreferenz oder ein Primitiv sein kann. Wenn es sich um ein Objekt handelt, muss es getestet werden
null
, um NPE zu vermeiden. Für mich ist es psychologisch einfacher, sich daran zu erinnern, 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 dann sicher, wenn
a
es sich um ein Grundelement handelt.Für mich habe ich jetzt die Empfehlungen:
Boolean
von einer Methode zurück, wie sie sein könntenull
. Nur zurückboolean
.Boolean
zum Umschließen von Elementen in Containern oder von Argumenten für Methoden, bei denen Objekte erforderlich sindquelle
Wrapper-Klassen für Grundelemente können verwendet werden, wenn Objekte erforderlich sind. Sammlungen sind ein gutes Beispiel.
Stellen Sie sich aus irgendeinem Grund Speicher eine Folge von müssen
boolean
in einArrayList
, kann dies durch Boxen erfolgenboolean
inBoolean
.Es gibt ein paar Worte über diese hier
Aus der Dokumentation:
http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
quelle
Boolean
Wrapper ist nützlich, wenn Sie möchten, ob nebentrue
und ein Wert zugewiesen wurde oder nichtfalse
. Es hat die folgenden drei Zustände:null
Während
boolean
hat nur zwei Staaten:Der obige Unterschied macht es hilfreich in Wertelisten
Boolean
, die haben könnenTrue
,False
oderNull
.quelle
Ich nehme an, in einigen Fällen sollten Sie einen Mechanismus haben, um ein Boolesches Feld zu unterscheiden, das bereits einen Wert festgelegt hat oder nicht.
quelle
Hauptzweck für Boolean ist der Nullwert. Der Nullwert besagt, dass die Eigenschaft undefiniert ist , z. B. eine nullbare Datenbankspalte.
Wenn Sie wirklich alles vom primitiven Booleschen in den Wrapper-Booleschen konvertieren müssen, können Sie Folgendes verwenden, um alten Code zu unterstützen:
quelle
Es gibt viele Verwendungsmöglichkeiten für den Wert ** null ** im Booleschen Wrapper! :) :)
Beispielsweise können Sie in einem Formular ein Feld mit dem Namen "Newsletter" haben, das angibt, ob der Benutzer einen Newsletter von Ihrer Website möchte oder nicht. Wenn der Benutzer in diesem Feld keinen Wert auswählt, möchten Sie möglicherweise ein Standardverhalten für diese Situation implementieren (Senden? Nicht senden?, Frage erneut? Usw.). Nicht gesetzt (oder nicht ausgewählt oder ** null **) ist eindeutig nicht dasselbe wie wahr oder falsch.
Wenn "nicht gesetzt" jedoch nicht für Ihr Modell gilt, ändern Sie das boolesche Grundelement nicht;)
quelle
In einer strengen Definition eines booleschen Elements gibt es nur zwei Werte. In einer perfekten Welt wäre das wahr. In der realen Welt kann das Element fehlen oder unbekannt sein. In der Regel handelt es sich dabei um Benutzereingaben. In einem bildschirmbasierten System kann dies durch eine Bearbeitung erzwungen werden. In einer Stapelwelt, die entweder eine Datenbank- oder eine XML-Eingabe verwendet, kann das Element leicht fehlen.
In der nicht perfekten Welt, in der wir leben, ist das Boolesche Objekt insofern großartig, als es den fehlenden oder unbekannten Zustand als Null darstellen kann. Schließlich modellieren Computer nur die reale Welt und sollten alle möglichen Zustände berücksichtigen und sie mit auslösenden Ausnahmen behandeln (meistens, da es Anwendungsfälle gibt, in denen das Auslösen der Ausnahme die richtige Antwort wäre).
In meinem Fall war das Boolesche Objekt die perfekte Antwort, da im Eingabe-XML manchmal das Element fehlte und ich immer noch einen Wert abrufen, ihn einem Booleschen Wert zuweisen und dann nach einer Null suchen konnte, bevor ich versuchte, einen wahren oder falschen Test damit zu verwenden .
Nur meine 2 Cent.
quelle
Für all die guten Antworten oben werde ich nur ein konkretes Beispiel in der Java-Servlet-
HttpSession
Klasse geben. Hoffe, dieses Beispiel hilft, einige Fragen zu klären, die Sie möglicherweise noch haben.Wenn Sie Werte für eine Sitzung speichern und abrufen müssen, verwenden Sie die Methoden
setAttribute
(String, Object) undgetAttribute
(String, Object). Für einen booleschen Wert müssen Sie die boolesche Klasse verwenden, wenn Sie sie in einer http-Sitzung speichern möchten.Die letzte Zeile verursacht a,
NullPointerException
wenn die Attributwerte nicht festgelegt sind. (was der Grund ist, der mich zu diesem Beitrag geführt hat). Der logische Zustand 3 bleibt also bestehen, unabhängig davon, ob Sie ihn verwenden möchten oder nicht.quelle
Der beste Weg wäre, Boolesche Werte vollständig zu vermeiden, da jeder Boolesche Wert impliziert, dass Sie an einer anderen Stelle in Ihrem Code eine bedingte Anweisung haben (siehe http://www.antiifcampaign.com/ und diese Frage: Können Sie einen Algorithmus ohne eine if-Anweisung schreiben ? ? ).
Pragmatisch gesehen müssen Sie jedoch von Zeit zu Zeit Boolesche Werte verwenden. Wie Sie bereits selbst herausgefunden haben, ist der Umgang mit Booleschen Werten fehleranfälliger und umständlicher. Daher würde ich vorschlagen, wo immer möglich Boolesche Werte zu verwenden. Ausnahmen hiervon könnte eine Legacy-Datenbank mit nullbaren Booleschen Spalten sein, obwohl ich versuchen würde, dies auch in meiner Zuordnung zu verbergen.
quelle
Boolean kann sehr hilfreich sein, wenn Sie drei Zustände benötigen. Wie beim Softwaretest, wenn der Test bestanden wurde, senden Sie true, wenn er fehlgeschlagen ist, senden Sie false und wenn der Testfall unterbrochen ist, senden Sie null, was bedeutet, dass der Testfall nicht ausgeführt wurde.
quelle