Java if, else и else if
Управление потоком выполнения в Java с помощью if, else if и else, а также правильная вложенность условий.
Программа, которая всегда выполняет одну и ту же последовательность операторов, не слишком полезна. if — это способ задать вопрос в Java и выбрать следующее действие. Вместе с else if и else он образует основу каждого решения, которое когда-либо примет ваш код.
Базовый if
if (condition) {
// runs only when condition is true
}Условие должно быть выражением типа boolean — никаких truthy/falsy-значений, как в JavaScript или Python. if (1) не скомпилируется; if (count > 0) — скомпилируется.
int age = 20;
if (age >= 18) {
System.out.println("You can vote.");
}Добавление else
else предоставляет альтернативную ветвь — то, что выполняется, когда условие равно false:
int age = 16;
if (age >= 18) {
System.out.println("You can vote.");
} else {
System.out.println("Too young to vote.");
}Выполняется ровно одна из двух ветвей. Никакого сквозного прохода нет.
Цепочка с else if
Для более чем двух вариантов используйте цепочку else if. Java проверяет каждое условие сверху вниз и выполняет первую ветвь, условие которой истинно; остальные пропускаются:
int score = 72;
if (score >= 90) {
System.out.println("A");
} else if (score >= 80) {
System.out.println("B");
} else if (score >= 70) {
System.out.println("C");
} else {
System.out.println("F");
}Порядок важен. Если поставить самое мягкое условие первым, оно поглотит все последующие случаи. Пример выше выводит C, потому что score >= 70 — первое совпадение, хотя score >= 60 тоже было бы истинным, если бы проверялось.
Фигурные скобки необязательны — но используйте их
Java позволяет опустить скобки, когда ветвь состоит из одного оператора:
if (loggedIn)
showDashboard();
else
showLogin();Не делайте этого. Всегда используйте фигурные скобки. Две строки ниже выглядят одинаково, но ведут себя по-разному:
if (loggedIn)
showDashboard();
logActivity(); // ALWAYS runs — not part of the if!
if (loggedIn) {
showDashboard();
logActivity(); // both inside the if
}Цена {} — два символа; цена ошибки — ваши выходные.
Boolean-выражения внутри if
Условие может быть чем угодно, что вычисляется в boolean:
if (x > 0 && x < 100) { ... }
if (name.equals("admin")) { ... }
if (!list.isEmpty()) { ... }
if (user != null && user.isActive()) { ... }Обратите внимание, что if — это оператор, а не выражение: он выполняет действие, но сам не производит значения, поэтому нельзя написать int x = if (...). Для версии, производящей значение, используйте Тернарный оператор.
Последний паттерн — сначала проверка на null, затем вызов метода — использует ленивые вычисления (short-circuit evaluation). Если user равен null, user.isActive() никогда не вызывается. Подробнее о &&, || и ! — в разделе Логические операторы, о >, == и аналогах — в разделе Операторы сравнения.
Вложенные операторы if
Можно поместить if внутрь другого if. Иногда это самый понятный способ выразить условие:
if (user != null) {
if (user.isAdmin()) {
System.out.println("Welcome, admin.");
} else {
System.out.println("Welcome, user.");
}
} else {
System.out.println("Please log in.");
}Однако глубокая вложенность плохо читается. Ранние возвраты обычно упрощают код:
if (user == null) {
System.out.println("Please log in.");
return;
}
if (user.isAdmin()) {
System.out.println("Welcome, admin.");
return;
}
System.out.println("Welcome, user.");Меньше отступов — легче читать.
Распространённая ошибка: = вместо ==
Начинающие, пришедшие из других языков, иногда пишут:
if (x = 5) { ... } // compile error= — это присваивание, == — сравнение. В отличие от C, Java отвергает это на этапе компиляции, если только переменная не является boolean — потому что результат int x = 5 имеет тип int, а не boolean. Это небольшое преимущество, которое система типов Java предоставляет бесплатно.
Практический пример
Цепочка else if ниже конвертирует числовые оценки в буквенные. Запустите её и убедитесь в правильности вывода:
Вывод:
95 -> A
82 -> B
71 -> C
68 -> D
45 -> FКогда использовать switch
Длинная цепочка else if, проверяющая одну переменную по списку фиксированных значений, зачастую понятнее в виде оператора switch. Используйте if/else if, когда ветви проверяют разные выражения или диапазоны (как в примере с оценками выше); используйте switch, когда сравниваете одно значение с несколькими константами.
Что дальше
Для однострочного условного присваивания Тернарный оператор зачастую читается лучше, чем полный if/else.