Есть ли причина для "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?