Коротке твердження 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);

14
FWIW, я відчуваю, що ніколи не потрібно писати, <bool condition> ? true : falseоскільки це точно еквівалентно просто <bool condition>.
Анджей Дойл

2
Очевидно! Але monczek запитав про коротке твердження If-Else, тому я закодував його, щоб показати синтаксис.
mauretto

4

Тернарний оператор може бути лише правою стороною завдання, а не власною заявою.

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


Неправда, що умовний оператор можна використовувати лише на RHS присвоєння. Він може бути використаний у будь-якому місці виразу.

3

Як вказували інші, щось із форми

x ? y : z

це вираз, а не (повне) твердження. Це значення r, яке потрібно десь використати - наприклад, у правій частині призначення, або параметру функції тощо.

Можливо, ви могли б переглянути це: http://download.oracle.com/javase/tutorial/java/nutsandbolts/expressions.html


2

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

З того, що я можу сказати, ви просто хочете переключити стан видимості правильно? Чому б просто не використовувати !оператор?

jxPanel6.setVisible(!jxPanel6.isVisible);

Це не твердження if, але я віддаю перевагу цьому методу для коду, пов’язаного з вашим прикладом.


Крім того, якщо ви намагаєтеся переключити стан, я думаю, що твердження є зворотним. Це чому це не спрацювало? Це має бути jXPanel6.isVisible ()? jXPanel6.setVisible (false): jXPanel6.setVisible (true);
Енді Боді

Якщо це не оператор перемикання, то я не розумію мети зробити щось видиме, що вже встановлено таким чином. IsVisible отримує стан, а setVisible встановлює стан, чи не так? Якщо оператор isVisible повертає true, навіщо встановлювати його знову true. Мені чогось не вистачає?
Енді Боді

1

Ви можете зробити це так просто, як це, я зробив це в реакційних гачках:

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

вона дорівнювала цій довжині, якщо функція нижче:

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

Сподіваюся, це допомагає ^ _ ^

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.