Есть ли причина для "Boolean.TRUE.equals(x)" в Java?

Я столкнулся с этим кодом в одном из проектов, над которыми я работаю

(Это на Java)

if (Boolean.TRUE.equals(foo.isBar()))

Foo # isBar() определяется как boolean isBar(), поэтому он не может вернуть null

Есть ли какая-то причина, почему это должно быть написано именно так? Я сам просто напишу

if (foo.isBar())

но, возможно, мне не хватает чего-то тонкого.

Спасибо

Ответ 1

Так как isBar возвращает примитив boolean, семантическая разница отсутствует. Кроме того, второй способ более краткий, более понятный и более эффективный, так как для вызова не нужно будет автобоксироваться, а затем снова извлечь исходное булевое. Учитывая все это, нет оснований для использования первого метода, а несколько - для использования второго, поэтому используйте второе. Я даю много возможностей своим коллегам, но я сидел и разговаривал с кем-нибудь, кто добавил что-то подобное профессиональному коду.

Ответ 2

Надеюсь, что foo.isBar() возвращает логическое значение. В этом случае вы всегда можете написать if (foo.isBar()). Если вы foo.isBar() вернете Boolean, то это может быть либо Boolean.TRUE, Boolean.FALSE, либо NULL. В этом случае if (Boolean.TRUE.equals(foo.isBar())) гарантирует, что блок if выполняется в одном сценарии (TRUE) и опущен в оставшемся 2.

Сверх и выше if (foo.isBar()) не удастся, когда foo.isBar() возвращает Boolean NULL.

Ответ 3

Я бы заподозрил "старый старый код без уважительной причины" - и на самом деле, я бы сказал, что это хуже. (Интересно, как сравнивать int.)

Для кода, использующего TRUE.equals, требуется преобразование в бокс, дополнительный вызов метода (и все внутри) и, в конце концов, он просто выглядит неаккуратным.


Единственная причина, по которой я знаю, - это если foo.isBar было введено как возвращающее Boolean (не Boolean) и где оно может вернуться null:

Boolean b = null;

// throws an exception when it tries to unbox b because it is null
boolean isTrue1 = (boolean)b;

// evaluates to false
boolean isTrue2 = Boolean.TRUE.equals(b);

// evaluates to false as well
boolean isTrue3 = b != null ? (boolean)b : false;

Ответ 4

Некоторые люди считают (я не являюсь одним из них), что чрезмерно явное делает булевы условия более читабельными. Например, используя

if(foo == true) вместо if(foo)

Возможно, это аналогичный случай?

Ответ 5

в первом условии вы проверяете равенство логического объекта, соответствующего true. и вы используете первое условие в своем коде, потому что ваша версия java не поддерживает autounboxing, поэтому вам нужно использовать логический объект.

В чем разница между Boolean.TRUE и true в Java?