Krótkie stwierdzenie IF - ELSE

82

Staram się, aby mój kod był bardziej czytelny, więc zdecydowałem się użyć krótkich instrukcji IF.

Oto mój kod, który nie działa („nie jest to instrukcja”):

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

Co w tym złego? Potrzebuje nawiasów? Gdzie?

monczek
źródło
2
Chociaż mautetto zapewnił lepszy sposób pisania tego, ta struktura jest zwykle nazywana operatorem trójskładnikowym. (Na wypadek, gdybyś się zastanawiał;))
Reese Moore
To operator warunkowy . „Trójskładnikowy” oznacza po prostu, że ma 3 operandy.
Link do specyfikacji języka dla operatora warunkowego: docs.oracle.com/javase/specs/jls/se10/html/…

Odpowiedzi:

215

„Wyrażenie trójskładnikowe” x ? y : zmoże być używane tylko do przypisania warunkowego . Oznacza to, że możesz zrobić coś takiego:

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

ponieważ wyrażenie trójargumentowe zwraca coś (typu Stringw tym przykładzie).

Tak naprawdę nie ma być używany jako krótki, liniowy if-else. W szczególności nie można go użyć, jeśli poszczególne części nie zwracają wartości lub zwracają wartości niezgodnych typów. (Więc chociaż możesz to zrobić, jeśli obie metody zwracają tę samą wartość, nie powinieneś wywoływać jej tylko w celu uzyskania efektu ubocznego).

Zatem właściwym sposobem na zrobienie tego byłoby użycie bloku if-else:

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

który oczywiście można skrócić do

jXPanel6.setVisible(jXPanel6.isVisible());

Oba te ostatnie wyrażenia są dla mnie bardziej czytelne, ponieważ wyraźniej wyrażają to, co próbujesz zrobić. (Nawiasem mówiąc, czy twoje warunki były niewłaściwe? Wygląda na to, że to nie jest operacja, a nie przełącznik).

Nie myl małej liczby znaków z czytelnością . Kluczową kwestią jest to, co jest najłatwiejsze do zrozumienia; a lekkie nadużywanie cech językowych jest zdecydowanym sposobem na zdezorientowanie czytelników lub przynajmniej zmusić ich do zastanowienia się.

Andrzej Doyle
źródło
1
Po prostu nie jest prawdą, że do przypisania można używać tylko operatora warunkowego. Możesz go używać wszędzie tam, gdzie wymagane jest wyrażenie.
28
jXPanel6.setVisible(jXPanel6.isVisible());

lub w swoim formularzu:

jXPanel6.setVisible(jXPanel6.isVisible()?true:false);
mauretto
źródło
14
FWIW, czuję, że nigdy nie ma potrzeby pisać, <bool condition> ? true : falseponieważ jest to dokładnie równoważne z just <bool condition>.
Andrzej Doyle
2
Oczywiście! Ale monczek zapytał o instrukcję Krótkie Jeśli-Inaczej, więc zakodowałem ją tylko po to, by pokazać składnię.
mauretto
4

Operator trójskładnikowy może być tylko prawą stroną przypisania, a nie własnym oświadczeniem.

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

perdian
źródło
Nie jest prawdą, że operator warunkowy może być używany tylko po prawej stronie przypisania. Można go używać wszędzie tam, gdzie można użyć wyrażenia.
2

Trochę spóźniłem się na imprezę, ale dla przyszłych czytelników.

Z tego, co mogę powiedzieć, chcesz tylko przełączyć stan widoczności, prawda? Dlaczego po prostu nie skorzystać z !operatora?

jxPanel6.setVisible(!jxPanel6.isVisible);

To nie jest instrukcja if, ale wolę tę metodę dla kodu związanego z twoim przykładem.

Andy Body
źródło
Ponadto, jeśli próbujesz przełączyć stan, myślę, że instrukcja jest wsteczna. Czy to dlatego to nie zadziałało? Czy powinna to być jXPanel6.isVisible ()? jXPanel6.setVisible (false): jXPanel6.setVisible (true);
Andy Body
Jeśli nie jest to instrukcja przełączania, to nie rozumiem celu uczynienia czegoś widocznym, co już jest ustawione w ten sposób. IsVisible pobiera stan, a setVisible ustawia stan, prawda? Jeśli instrukcja isVisible zwraca wartość true, po co ustawiać ją ponownie na true. Czy coś mi brakuje?
Andy Body
1

Możesz to zrobić tak prosto, zrobiłem to w hookach:

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

była równa tej długiej funkcji if poniżej:

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

Mam nadzieję, że to pomoże ^ _ ^

Steven S.
źródło