Kurze IF - ELSE - Anweisung

81

Ich versuche, meinen Code lesbarer zu machen, deshalb habe ich mich für einige kurze IF-Anweisungen entschieden.

Hier ist mein Code, der nicht funktioniert ("keine Aussage"):

jXPanel6.isVisible() ? jXPanel6.setVisible(true) : jXPanel6.setVisible(false);

Was ist daran falsch? Benötigen Sie Klammern? Wo?

monczek
quelle
2
Obwohl mautetto eine bessere Schreibweise bietet, wird diese Struktur normalerweise als ternärer Operator bezeichnet. (Falls Sie sich gefragt haben;))
Reese Moore
Es ist der bedingte Operator. "Ternär" bedeutet nur, dass es 3 Operanden hat.
Link zur Sprachspezifikation für den bedingten Operator: docs.oracle.com/javase/specs/jls/se10/html/…

Antworten:

214

Der "ternäre Ausdruck" x ? y : zkann nur für die bedingte Zuweisung verwendet werden . Das heißt, Sie könnten so etwas tun:

String mood = inProfit() ? "happy" : "sad";

weil der ternäre Ausdruck etwas zurückgibt (vom Typ Stringin diesem Beispiel).

Es ist nicht wirklich als kurze Inline gedacht if-else. Insbesondere können Sie es nicht verwenden, wenn die einzelnen Teile keinen Wert oder Werte inkompatibler Typen zurückgeben. (Während Sie dies tun könnten, wenn beide Methoden zufällig denselben Wert zurückgeben, sollten Sie ihn nicht nur zu Nebenwirkungszwecken aufrufen.)

Der richtige Weg, dies zu tun, wäre also nur ein if-else-Block:

if (jXPanel6.isVisible()) {
    jXPanel6.setVisible(true);
}
else {
    jXPanel6.setVisible(false);
}

was natürlich verkürzt werden kann

jXPanel6.setVisible(jXPanel6.isVisible());

Diese beiden letzteren Ausdrücke sind für mich besser lesbar, da sie klarer kommunizieren, was Sie versuchen zu tun. (Und übrigens, haben Sie Ihre Bedingungen falsch herum verstanden? Es sieht so aus, als wäre dies sowieso ein No-Op und kein Toggle).

Verwechseln Sie nicht die geringe Anzahl von Zeichen mit der Lesbarkeit . Der entscheidende Punkt ist das, was am leichtesten zu verstehen ist; und ein leichter Missbrauch von Sprachmerkmalen ist ein eindeutiger Weg, um die Leser zu verwirren oder sie zumindest zu einer mentalen Doppelaufnahme zu bewegen.

Andrzej Doyle
quelle
1
Es ist einfach nicht wahr, dass Sie den bedingten Operator nur für die Zuweisung verwenden können. Sie können es überall dort verwenden, wo ein Ausdruck erforderlich ist.
28
jXPanel6.setVisible(jXPanel6.isVisible());

oder in deiner Form:

jXPanel6.setVisible(jXPanel6.isVisible()?true:false);
Mauretto
quelle
14
FWIW, ich habe das Gefühl, dass es nie nötig ist zu schreiben, <bool condition> ? true : falseweil es genau gleichbedeutend ist mit nur <bool condition>.
Andrzej Doyle
2
Offensichtlich! Aber monczek fragte nach der Short If-Else-Anweisung, also habe ich sie nur codiert, um die Syntax zu zeigen.
Mauretto
4

Der ternäre Operator kann nur die rechte Seite einer Zuweisung sein und keine eigene Anweisung.

http://www.devdaily.com/java/edu/pj/pj010018/

perdian
quelle
Es ist nicht wahr, dass der bedingte Operator nur auf der rechten Seite einer Zuweisung verwendet werden kann. Es kann überall dort verwendet werden, wo ein Ausdruck verwendet werden kann.
3

Wie andere angedeutet haben, etwas von der Form

x ? y : z

ist ein Ausdruck, keine (vollständige) Aussage. Es ist ein Wert, der irgendwo verwendet werden muss - wie auf der rechten Seite einer Zuweisung oder ein Parameter für eine Funktion usw.

Vielleicht könnten Sie sich das ansehen: http://download.oracle.com/javase/tutorial/java/nutsandbolts/expressions.html

Anshuman Fotedar
quelle
2

Ich bin etwas spät zur Party, aber für zukünftige Leser.

Nach allem, was ich sagen kann, möchten Sie nur den Sichtbarkeitsstatus umschalten, oder? Warum nicht einfach den !Operator benutzen ?

jxPanel6.setVisible(!jxPanel6.isVisible);

Es ist keine if-Anweisung, aber ich bevorzuge diese Methode für Code, der sich auf Ihr Beispiel bezieht.

Andy Body
quelle
Auch wenn Sie versuchen, den Status umzuschalten, denke ich, dass die Anweisung rückwärts ist. Hat es deshalb nicht funktioniert? Sollte es jXPanel6.isVisible () sein? jXPanel6.setVisible (false): jXPanel6.setVisible (true);
Andy Body
Wenn es sich nicht um eine Umschaltanweisung handelt, verstehe ich den Zweck nicht, etwas sichtbar zu machen, das bereits so festgelegt ist. Das isVisible ruft den Status ab und das setVisible setzt den Status, richtig? Wenn die isVisible-Anweisung true zurückgibt, setzen Sie sie erneut auf true. Vermisse ich etwas
Andy Body
1

Sie können es so einfach machen, ich habe es in Reaktionshaken gemacht:

 (myNumber == 12) ? "true" : "false"

es war gleich so lange wenn Funktion unten:

if (myNumber == 12) {
  "true"
} else {
  "false"
}

Hoffe es hilft ^ _ ^

Steven S.
quelle