Der sauberste Weg, um eine boolesche Variable in Java umzuschalten?

211

Gibt es eine bessere Möglichkeit, einen Booleschen Wert in Java zu negieren als ein einfaches if-else?

if (theBoolean) {
    theBoolean = false;
} else {
    theBoolean = true;
}
Kevin Griffin
quelle
Oh, schön, ich wollte gerade die gleiche Frage stellen, obwohl meine Frage spezifisch für Javascript / as3 oder ECMAScript im Allgemeinen gewesen wäre, nehme ich an ... was von dieser Frage leicht abgedeckt wird.
Matt Lohkamp
Was ist, wenn es keine gibt? Operator ??
onmyway133

Antworten:

537
theBoolean = !theBoolean;
Aaron Maenpaa
quelle
16
Das ist ... wirklich offensichtlich - oops! Ich weiß nicht, warum ich nicht daran gedacht habe. Vielen Dank.
Kevin Griffin
! Boolean scheint eine natürliche Wahl zu sein - vielleicht in der Zukunft.
Matt Lohkamp
21
@ypnos : !!bool == !(!(bool)) == bool.
Christoffer Hammarström
12
@ ChristofferHammarström Nach dieser Logik sollte dann nicht --integer == - (- (integer)) == integer?
user515655
1
@ user515655 - Die Sprache definiert einen --Operator (tatsächlich zwei davon zusammen mit zwei ++Operatoren), definiert jedoch keinen !!Operator. Wenn Sie möchten -(-(integer)), können Sie Leerzeichen zwischen den beiden -Zeichen verwenden. Aber !!Parsen als zwei !Betreiber unabhängig von Leerraum.
Ted Hopp
164
theBoolean ^= true;

Weniger Tastenanschläge, wenn Ihre Variable länger als vier Buchstaben ist

Bearbeiten : Code liefert in der Regel nützliche Ergebnisse, wenn er als Google-Suchbegriffe verwendet wird. Der obige Code funktioniert nicht. Für diejenigen, die es brauchen, ist es bitweises XOR wie hier beschrieben .

Pateksan
quelle
14
und es entspricht DRY :)
Tetha
6
In der Kürze liegt die Würze.
Paul Brinkley
7
Jetzt kann ich nebenbei Name-Drop (Syntax-Drop?) XOR verwenden, um vor meinen Programmiererfreunden cool auszusehen. Ihre Antwort sollte mit der auserwählten verschmolzen werden, zusammen sind sie reine Perfektion.
Matt Lohkamp
6
@ScottStanchfield Solche Leute sollten es lernen. Es ist überhaupt nicht schwer, es ist kein Hack, und nicht zu wissen, dass es oft zu beschissenem Code führt, wie z. B. derjenige, der diese Frage stellt. Dies ist eine echte Explosion - fünf Zeilen nach den Standardkonventionen!
Maaartinus
4
Dieser Vorgang ist auch 12% schneller als andere Versionen wie theBoolean = !theBoolean;odertheBoolean = theBoolean ? false : true;
Blaine Kasten
32

Es gibt einige

Der "offensichtliche" Weg (für die meisten Menschen)

theBoolean = !theBoolean;

Der "kürzeste" Weg (meistens)

theBoolean ^= true;

Der "visuellste" Weg (am unsichersten)

theBoolean = theBoolean ? false : true;

Extra: Umschalten und in einem Methodenaufruf verwenden

theMethod( theBoolean ^= true );

Da der Zuweisungsoperator immer das zurückgibt, was zugewiesen wurde, wird der Wert über den bitweisen Operator umgeschaltet und anschließend der neu zugewiesene Wert zurückgegeben, der im Methodenaufruf verwendet werden soll.

Levit
quelle
Wickeln Sie die Implementierung in eine Funktion / Methode namens toggle ein, und dann gibt es fast keine Möglichkeit, sie zu verwirren.
Lambage
@ Reiner: Auf Cjeden Fall, aber Javaes ist nicht erlaubt, Boolesche und Ganzzahlen zu mischen (auch Dinge wie while(1)sind in Java nicht möglich).
Levite
@Lambage: Stimmt, aber auf der anderen Seite können Sie einen Booleschen Wert nicht durch einfaches Übergeben umschalten, da es in Java nicht möglich ist, Grundelemente als Referenz zu übergeben. Sie müssten das Ergebnis der Methode Ihrer Variablen neu zuweisen oder auf andere Weise eine Wrapper-Klasse für den Booleschen Wert erstellen.
Levite
Der "offensichtliche Weg" oben wird von SONAR mit - gekennzeichnet. Innere Zuweisungen sollten vermieden werden.
Orby
2

Wenn Sie boolesche NULL-Werte verwenden und diese als falsch betrachten, versuchen Sie Folgendes:

static public boolean toggle(Boolean aBoolean) {
    if (aBoolean == null) return true;
    else return !aBoolean;
}

Wenn Sie keine booleschen NULL-Werte übergeben, versuchen Sie Folgendes:

static public boolean toggle(boolean aBoolean) {
   return !aBoolean;
}

Diese sind die saubersten, weil sie die Absicht in der Methodensignatur zeigen, sind leichter zu lesen als die ! Betreiber und kann leicht debuggt werden.

Verwendung

boolean bTrue = true
boolean bFalse = false
boolean bNull = null

toggle(bTrue) // == false
toggle(bFalse) // == true
toggle(bNull) // == true

Wenn Sie Groovy oder eine Sprache verwenden, die Erweiterungsmethoden zulässt, können Sie natürlich eine Erweiterung registrieren und einfach Folgendes tun:

Boolean b = false
b = b.toggle() // == true
Steven Spungin
quelle
Guter Ansatz, aber nicht ganz eindeutig (imho). Für jemanden, der nur "toggle (..)" verwendet / liest, könnte der Aufruf der Methode (ohne sie erneut der Variablen zuzuweisen) die zugrunde liegende Variable bereits umschalten. Es ist für uns im Moment offensichtlich, den Code zu sehen, aber im wirklichen Leben könnte es ziemlich schwierig sein, ihn zu debuggen. Ein besserer Methodenname könnte "Gegenteil" oder möglicherweise "Negation" sein, um dies etwas offensichtlicher zu machen; oder verwenden Sie den ersten Ansatz mit einem Objekt Booleanund schalten Sie es wirklich innerhalb der Methode um (aber immer noch etwas mehrdeutig).
Levite
2

Diese Antwort wurde bei der Suche nach "Java Invert Boolean Function" angezeigt. Das folgende Beispiel verhindert, dass bestimmte statische Analysetools aufgrund der Verzweigungslogik fehlschlagen. Dies ist nützlich, wenn Sie einen Booleschen Wert invertieren müssen und keine umfassenden Komponententests erstellt haben;)

Boolean.valueOf(aBool).equals(false)

oder alternativ:

Boolean.FALSE.equals(aBool)

oder

Boolean.FALSE::equals
Doktor Parameter
quelle
1
Ich mag die Tatsache, dass Sie Boolean.FALSE::equalszu einer Mapping-Funktion übergehen könnten , anstatt ein kleines Lambda zu schreiben
Patrick Parker
0

Wenn Sie nichts besonders Professionelles tun, können Sie immer eine Util-Klasse verwenden. Beispiel: Eine Util-Klasse aus einem Projekt für eine Klasse.

public class Util {


public Util() {}
public boolean flip(boolean bool) { return !bool; }
public void sop(String str) { System.out.println(str); }

}

Dann erstellen Sie einfach ein Util-Objekt Util u = new Util(); und haben etwas für die RückgabeSystem.out.println( u.flip(bool) );

Wenn Sie am Ende immer wieder dasselbe verwenden, verwenden Sie eine Methode, und erstellen Sie eine Util-Klasse, insbesondere wenn es sich um projektübergreifende Methoden handelt. Keine Ahnung, was der Industriestandard ist. (Erfahrene Programmierer können mich gerne korrigieren)

Will D.
quelle
0

Die Klasse BooleanUtilsunterstützt die Negation eines Booleschen Werts. Sie finden diese Klasse in commons-lang: commons-lang

BooleanUtils.negate(theBoolean)
Alex
quelle
-4

Vor:

boolean result = isresult();
if (result) {
    result = false;
} else {
    result = true;
}

Nach dem:

boolean result = isresult();
result ^= true;
Nikhil Kumar
quelle
Wer hat jemals abgestimmt? Können Sie bitte auch den Grund erklären?
Nikhil Kumar
11
Zwei Hauptgründe, warum ich mir vorstellen kann, warum dich jemand herabgestimmt hat: 1) Thread-Nekromantie ( komm schon! Die Frage wurde vor 7 (!) Jahren gestellt! ) Und deine Antwort bringt nichts Neues auf den Tisch; 2) Der Wähler erwartete etwas " Saubereres " ( sprich : kürzer ) - Aaron Maenpaas Antwort ist ein Paradebeispiel dafür.
Priidu Neemre
5
@Elltz: Im Gegenteil - ich habe ihn tatsächlich positiv bewertet, da die Antwort technisch korrekt war. Ich muss jedoch sagen, dass ich den Trend nicht genieße, die Antworten früherer Benutzer für billiges Karma zu fälschen (siehe die Antwort von nlaq).
Priidu Neemre
@PriiduNeemre, Frage gestellt & Antwort vor mehr als 7 Jahren angenommen & denkst du, außer von deiner Liste wird jemand eine positive Bewertung abgeben? Abgesehen davon ist Ihre Antwort auch nicht bis zur Marke .. :(
user1140237
2
after: boolean result =! isresult ();
Petter Friberg