Краткая инструкция IF - ELSE

82

Я пытаюсь сделать свой код более читабельным, поэтому решил использовать несколько коротких операторов IF.

Вот мой код, который не работает («не утверждение»):

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

Что в этом плохого? Нужны брекеты? Где?

Мончек
источник
2
Хотя Маутетто предоставил лучший способ записать это, эту структуру обычно называют тернарным оператором. (Если вам интересно;))
Риз Мур
Это условный оператор. «Тернарный» просто означает, что у него 3 операнда.
Ссылка на спецификацию языка для условного оператора: docs.oracle.com/javase/specs/jls/se10/html/…

Ответы:

215

«Тернарное выражение» x ? y : zможно использовать только для условного присвоения . То есть вы могли бы сделать что-то вроде:

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

потому что тернарное выражение что-то возвращает ( Stringв этом примере типа).

На самом деле он не предназначен для использования в качестве короткого ряда if-else. В частности, вы не можете использовать его, если отдельные части не возвращают значение или возвращают значения несовместимых типов. (Таким образом, хотя вы могли бы сделать это, если оба метода вернули одно и то же значение, вы не должны вызывать его только для побочных эффектов).

Таким образом, правильный способ сделать это - использовать блок if-else:

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

который, конечно, можно сократить до

jXPanel6.setVisible(jXPanel6.isVisible());

Оба этих последних выражения для меня более читабельны, поскольку они более четко передают то, что вы пытаетесь сделать. (И, кстати, вы неправильно поняли свои условия? Похоже, что это все равно запретная операция, а не переключатель).

Не путайте небольшое количество символов с удобочитаемостью . Ключевым моментом является то, что легче всего понять; а легкое неправильное использование языковых функций - определенный способ запутать читателей или, по крайней мере, заставить их задуматься.

Анджей Дойл
источник
1
Это просто неправда, что вы можете использовать только условный оператор для присваивания. Вы можете использовать его везде, где требуется выражение.
28
jXPanel6.setVisible(jXPanel6.isVisible());

или в вашей форме:

jXPanel6.setVisible(jXPanel6.isVisible()?true:false);
Mauretto
источник
14
FWIW, я чувствую, что никогда не нужно писать, <bool condition> ? true : falseпотому что это в точности эквивалентно просто <bool condition>.
Анджей Дойл
2
Очевидно! Но Мончек спросил о коротком операторе If-Else, поэтому я закодировал его, чтобы показать синтаксис.
mauretto 05
4

Тернарный оператор может быть только правой частью присваивания, а не собственным утверждением.

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

пердиан
источник
Неверно, что условный оператор может использоваться только в правой части присваивания. Его можно использовать везде, где можно использовать выражение.
3

Как указывали другие, что-то в форме

x ? y : z

является выражением, а не (полным) утверждением. Это rvalue, которое нужно где-то использовать - например, в правой части присваивания, или параметр функции и т. Д.

Возможно, вы могли бы посмотреть на это: http://download.oracle.com/javase/tutorial/java/nutsandbolts/expressions.html

Аншуман Фотедар
источник
2

Я немного опоздал на вечеринку, но для будущих читателей.

Насколько я могу судить, вы просто хотите переключить состояние видимости, верно? Почему бы просто не воспользоваться !оператором?

jxPanel6.setVisible(!jxPanel6.isVisible);

Это не оператор if, но я предпочитаю этот метод для кода, связанного с вашим примером.

Энди Боди
источник
Кроме того, если вы пытаетесь переключить состояние, я думаю, что оператор обратный. Это почему не сработало? Это должен быть jXPanel6.isVisible ()? jXPanel6.setVisible (ложь): jXPanel6.setVisible (true);
Энди Боди
Если это не оператор переключения, то я не понимаю, зачем делать видимым то, что уже настроено таким образом. IsVisible извлекает состояние, а setVisible устанавливает состояние, верно? Если оператор isVisible возвращает true, зачем снова устанавливать его на true. Я что-то упускаю?
Энди Боди
1

Вы можете сделать это так просто, я сделал это в ответных хуках:

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

он был равен этой длинной функции if ниже:

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

Надеюсь, это поможет ^ _ ^

Стивен С.
источник