Wann sollten Nullwerte von Boolean verwendet werden?

Lesezeit: 11 Minuten

Benutzer-Avatar
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.

    – 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 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

Benutzer-Avatar
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().

  • Ein Nullwert in der Datenbank könnte auch bedeuten “Datei nicht gefunden”

    – Karl Johann

    25. Juni 2012 um 12:17 Uhr


  • 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 isSchrodinger‎CatAlive = null; (sorry, konnte nicht widerstehen ;)).

    – Matthias

    13. Dezember 2013 um 23:02 Uhr

Benutzer-Avatar
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

Benutzer-Avatar
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.

Das könnte Ihnen nützlich 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, zu der Sie eine andere Nullreferenz haben. Die Verwendung für Drei-Zustands-Logik ist ungeschickt.

EDIT: Beachten Sie, dass Boolean a = true; ist eine irreführende Aussage. Das kommt wirklich etwas näher Boolean a = new Boolean(true);
Siehe Autoboxing hier: http://en.wikipedia.org/wiki/Boxing_%28computer_science%29#Autoboxing

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>

Benutzer-Avatar
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.

Dazu ein paar Worte hier

Aus Dokumentation:

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.

http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

  • 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

1345710cookie-checkWann sollten Nullwerte von Boolean verwendet werden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy