// однострочный вариант с простым кодом
переменная = условие ? [код при true] : [код при false];
// многострочный вариант, когда условие слишком длинное
переменная = условие
? [код при true] : [код при false];
// многострочный вариант, когда и условия и код остальных секций слишком длинный
переменная = условие
? [код при true]
: [код при false];
int age = 20;
String status = (age >= 18) ? "Совершеннолетний" : "Несовершеннолетний";
System.out.println(status); // Совершеннолетний
// if-else
String msg;
if (isSuccess) {
msg = "Успех";
} else {
msg = "Ошибка";
}
// Тернарный оператор
String msg = isSuccess ? "Успех" : "Ошибка";
int discount = (total > 1000) ? 15 : 5;
System.out.println("Статус: " + (isActive ? "Активен" : "Неактивен"));
// Пример чуть сложнее
System.out.printf("Фактический: [%s%s%s]%n",
dbHundreds == currHundreds ? dbHundreds : "_",
dbTens == currTens ? dbTens : "_",
dbOnes == currOnes ? dbOnes : "_");
// Плохо: сложно понять логику
String result = a > b ? (c < d ? "A" : "B") : (e > f ? "C" : "D");
String result = (x > 10)
? (y < 5) ? "A" : "B"
: (z == 0) ? "C" : "D";
// Чуть лучшая читаемость за счет форматирования
String msg = score > 90 ? "Отлично"
: score > 75 ? "Хорошо"
: score > 60 ? "Удовлетворительно" : "Неудовлетворительно";
// if-else позволяет это
if (isValid) {
saveData();
log("Данные сохранены");
} else {
showError();
}
// Тернарный оператор — нет
int a = 5
b = 10;
int max = (a > b) ? a : b;
// max = 10
public String getRole(boolean isAdmin) {
return isAdmin ? "Admin" : "User";
}
int score = 85;
System.out.println("Результат: " + (score >= 50 ? "Сдал" : "Не сдал"));
String name = null;
String displayName = (name != null) ? name : "Гость";
// Вариант со сложным выражением
String result = object != null
&& object.isValid()
&& object.checkPermissions()
? getValue()
: getDefaultValue();
// избыточный тернарный оператор
boolean isEqual = (a == b) ? true : false;
// правильный вариант
boolean isEqual = (a == b);
// Ошибка компиляции.
// Так нельзя — тернарный оператор возвращает значение
(condition) ? System.out.println("Yes") : System.out.println("No");
// Правильный вариант — обычный if
if (condition) {
System.out.println("Yes");
} else {
System.out.println("No");
}
// Ошибка: перепутаны true/false ветви
int max = (a > b) ? b : a; // Возвращает минимум!
// Правильный вариант
int max = (a > b) ? a : b;
// Бессмысленный тернарный оператор
String message = (debug) ? "Debug mode" : "Debug mode";
// Правильный вариант (просто присвоить значение)
String message = "Debug mode";
float pow(long a, long b) {
float result = 1f;
for (long i = 0; i < Math.abs(b); i++) {
result *= a;
}
// избыточное присваивание result
return b < 0 ? result = 1 / result : result;
// лучше так
return b < 0 ? (1 / result) : result;
}
String userStatus = user.isActive()
? "Активный пользователь"
: "Неактивный пользователь";
double price = product.isOnSale()
? product.getSalePrice()
: product.getRegularPrice();
// Допустимо (2 уровня вложенности)
String access = user.isAdmin() ? "ADMIN"
: user.isModerator() ? "MODERATOR" : "USER";
String description = item.isAvailable()
? item.getDescription()
: null;
int score = (total > 100) ? (bonus * 2) : (bonus / 2);
int result = (a > b && c < d) ? x : y;