Boolean

Java Multithreading
9 уровень , 6 лекция
Открыта

— Привет, Амиго!

— Привет, Ким.

— Я тебе расскажу про тип Boolean. Это тоже «обертка» над типом boolean и он прост, как доска. Немного упрощенный код класса Boolean:

Код
class Boolean
{
 public static final Boolean TRUE = new Boolean(true);
 public static final Boolean FALSE = new Boolean(false);

 private final boolean value;

 public Boolean(boolean value) 
 {
  this.value = value;
 }

 public boolean booleanValue() 
 {
  return value;
 }

 public static Boolean valueOf(boolean b) 
 {
  return (b ? TRUE : FALSE);
 }
}

— Т.е. класс просто является «оберткой» над типом boolean.

— Ага. А еще у него есть две константы TRUE и FALSE, которые являются аналогами примитивных значений true/false.

С автобоксингом у него тоже все просто:

Код Что происходит на самом деле
Boolean a = true;
Boolean b = true;
Boolean c = false;
boolean d = a;
Boolean a = Boolean.valueOf(true);
Boolean b = Boolean.valueOf(true);
Boolean c = Boolean.valueOf(false);
boolean d = a.booleanValue();

А вот как происходят сравнения между типами boolean и Boolean:

Пример
boolean a = true;
Boolean b = true; //будет равен Boolean.TRUE
Boolean c = true; //будет равен Boolean.TRUE

a == b; //true (сравниваются как примитивы по значению)
a == c; //true (сравниваются как примитивы по значению)
b == c; //true (сравниваются по ссылке, но указывают на один и тот же объект)

Если очень нужно создать независимый объект Boolean, то надо создать его явно:

Пример
boolean a = true;
Boolean b = new Boolean(true); //новый объект Boolean
Boolean c = true; //будет равен Boolean.TRUE

a == b; //true (сравниваются как примитивы по значению)
a == c; //true (сравниваются как примитивы по значению)
b == c; //false (сравниваются по ссылке, указывают на различные объекты)

Собственно на этом все.

— Да, твои лекции покороче, чем у Билаабо.

А можно использовать Boolean внутри if ?

Boolean less = (2<3);
if (less)
{
….
}

— Да, только не забудь, что если less будет null, то выкинется исключение NullPointer.

— Да, я это уже понял. Только не держу все время в голове.

Комментарии (20)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Алексей Уровень 7
7 мая 2025
Как про меня. Я все это знаю. Только в голове все время не держу.
Denis Odesskiy Уровень 47
15 июня 2024
Советую открыть класс Boolean и посмотреть как он устроен внутри, лекция хорошая, но слишком уж " немного упрощенный код" упрощён по-моему, ну понятно чтобы саму суть показать. Но там много методов полезных еще, а сам класс и вправду очень простой...
Алексей Уровень 40 Expert
26 февраля 2024
Две последние лекции просто супер)Все в одном месте
Андрей Уровень 37
26 ноября 2021
непонятно что делает метод

 public boolean booleanValue() {
  return value;
 }
более понятно, если метод называется

 public boolean getBooleanValue()  {
  return value;
 }
Kurama Уровень 50
2 декабря 2022
Так boolean же этим и отличается от остальных примитивов: isAlive() вместо getAlive() или getIsAlive() С обёртками то же самое
Denis Odesskiy Уровень 47
15 июня 2024

public boolean booleanValue() {
 return value;
}
Этот метод часть класса Boolean, делает то что в нем написано. Назвали его так разработчики Java. Назови его они getBooleanValue(), это как минимум бы противоречило конвенции об именовании...
19 апреля 2021
мне в голову не приходит ни одного примера на кой логику оборачивать? если только не хочется сильно усложнить жизнь коллегам или тому самому маньяку который знает где я живу.
Montana~ Уровень 51
13 мая 2021
Был такой случай у меня, делал WEB-приложение, в запросе на сервер отправлял JSON, который маппился на Model. Так вот, если в сущности (Model) булево поле не обернуто в Boolean, то при маппинге JSON'а это булево поле по дефолту примет значение false, а если обернуть в Boolean, то поле будет по дефолту null.
Kirill Уровень 46
5 января 2025
Каким образом без использования класса-обертки ты примитивный boolean поместишь в коллекцию?
Дмитрий Уровень 35
22 мая 2018
на всякий случай напомню, что в Boolean за TRUE считается передача в конструктор значения "true" в любом регистре, всё остальное интерпретируется как FALSE: new Boolean("TrUe"); // true new Boolean("TrUE"); // true new Boolean("1"); // false new Boolean("false"); // false
egor44134 Уровень 36
25 октября 2017
final class Boolean
24 апреля 2017
Не понимаю почему не сделали для String и для Number сравнение именно по значениям через "=="... Было бы очень удобно и интуитивно сравнивать if (str == "some text") { ... } Если уж так надо сравнивать ссылки, то до явно по адресу типа if (SomeObject.address() == AnOther.address) { ... }
Семен Киселев Уровень 40
4 мая 2017
Почитайте про пул строк..
Artem Novikov Уровень 40
15 мая 2017
Напишите замечание в компанию Oracle.
Данил Суетин Уровень 35
23 мая 2017
Согласен. Но наверняка есть резоны, вряд ли такое простое решение не нашло бы стронников, не будь каких-то нюансов, которые мы выясним позже.
Константин Уровень 40
28 мая 2017
Думаю, что нюансы сложись так исторически, и переработка языка на "как удобней" наносит ущерб обратной совместимости.
Nikita Koliadin Уровень 40
28 июня 2018
В Java нету перегрузки операторов. По этой причине.
Андрей Уровень 37 Expert
4 декабря 2019
Для String'a есть. Надо уметь пользоваться...intern()
barracuda Уровень 41 Expert
2 ноября 2020
Спасибо, что напомнили об intern() !!!
Pavel Kurchavov Уровень 32
15 марта 2021
В Котлин есть такая штука, сравнивать объекты через ==, удобно)