Java Booleans
Используйте тип boolean в Java для хранения значений true/false и построения условной логики.
boolean — простейший примитив: он имеет ровно два значения, true и false. Каждое условие в Java — if, while, тернарный оператор ?:, операнды && и || — требует boolean. Вам не нужно знать об этом типе очень много, но понимание разницы между boolean и Boolean поможет избежать будущих ошибок.
На этой странице рассматриваются: объявление boolean-переменных, места, где компилятор требует их наличия, логические операторы, класс-обёртка Boolean и ловушка с null, разбор строк и эффективное хранение множества флагов.
Объявление boolean
boolean isOpen = true;
boolean ready = false;
boolean canPay = (balance >= amount);Ключевые слова — true и false — строчными буквами. Никаких True, TRUE, 1, 0 — Java строга в этом отношении.
Переменная boolean без инициализации имеет определённое значение по умолчанию только как поле (переменная экземпляра или статическая переменная), где оно равно false. Локальная переменная не имеет значения по умолчанию — попытка обратиться к ней до присваивания приведёт к ошибке компиляции:
class Light {
boolean on; // field — defaults to false
void check() {
boolean ready; // local — no default
// System.out.println(ready); // compile error: variable not initialized
ready = true;
System.out.println(ready); // OK now
}
}Boolean в условиях
Каждый if, while, do-while и средняя часть цикла for ожидают boolean:
boolean isAdult = age >= 18;
if (isAdult) {
System.out.println("Welcome!");
}
while (!stopRequested) {
process();
}Использовать число там, где требуется boolean, нельзя:
int x = 5;
// if (x) { ... } // compile error: int is not a boolean
if (x != 0) { ... } // OKЭто особенность, а не неудобство — она устраняет целый класс ошибок из языка C.
Логические операции
Три логических оператора (Логические операторы):
boolean a = true && false; // false
boolean b = true || false; // true
boolean c = !true; // false&& и || вычисляются по принципу короткого замыкания: в выражении a && b, если a равно false, b никогда не вычисляется; в a || b, если a равно true, b пропускается. Это позволяет делать защитные проверки, например s != null && s.isEmpty(). Побитовые операторы & и | вычисляют оба операнда — для boolean почти никогда не нужно именно это.
Распространённые идиомы
Не сравнивайте boolean с true или false — используйте переменную напрямую. Переменная и есть условие:
if (isOpen == true) { } // redundant
if (isOpen) { } // idiomatic
if (isOpen == false) { } // redundant
if (!isOpen) { } // idiomaticЧтобы переключить флаг, присвойте ему его отрицание. Это стандартный паттерн «переключения»:
boolean visible = true;
visible = !visible; // now false
visible = !visible; // back to trueBoolean — класс-обёртка
Класс-обёртка Boolean позволяет помещать boolean-значения в коллекции и передавать их как объекты:
List<Boolean> answers = new ArrayList<>();
answers.add(true);
answers.add(false);
Map<String, Boolean> flags = new HashMap<>();
flags.put("debug", true);Автоупаковка автоматически преобразует между boolean и Boolean. Главное, за чем нужно следить: ссылка типа Boolean может быть null, а примитивный boolean — нет.
Boolean maybe = null;
if (maybe) { ... } // throws NullPointerException — autounbox on nullИспользуйте Boolean.TRUE.equals(maybe) или явную проверку на null, если значение null возможно.
Разбор строк
Boolean.parseBoolean(s) возвращает true, если строка равна "true" (без учёта регистра), и false во всех остальных случаях — включая опечатки и неожиданные значения:
Boolean.parseBoolean("true"); // true
Boolean.parseBoolean("TRUE"); // true
Boolean.parseBoolean("yes"); // false
Boolean.parseBoolean("1"); // false
Boolean.parseBoolean(null); // falseЕсли вам нужна строгая валидация входных данных, напишите собственную проверку, а не полагайтесь на семантику «всё-что-не-true-это-false» этого метода.
boolean[] vs BitSet
Для небольшого числа boolean-значений boolean[] вполне подходит и хорошо читается:
boolean[] flags = new boolean[8];
flags[3] = true;Для тысяч или миллионов флагов BitSet эффективнее по памяти — внутри он упаковывает флаги в long-значения:
import java.util.BitSet;
BitSet seen = new BitSet();
seen.set(42);
System.out.println(seen.get(42)); // trueДемонстрация
Что дальше
Символы Java (char) — 16-битный примитив, хранящий одну кодовую единицу Unicode.