Почему я должен передать булевскую переменную в качестве параметра вместо “булевской переменной”?

Коллега попросил, чтобы я изменил подпись от использования примитивной "булевской переменной" к использованию классифицируемой "булевской переменной". Он не предложил очень хорошее объяснение почему?

Какой-либо из Вас услышал об этом, и какой-либо из Вас может объяснить, почему это имеет значение или не имеет значения?

Править: Он упомянул, что это была хорошая практика для открытых методов.

Использование поля является просто флагом, который говорит мне, назвать ли один поток или другого в зависимости от того, является ли это TRUE или FALSE.

23
задан Jaime Garcia 26 April 2010 в 18:49
поделиться

10 ответов

На самом деле я склонен ошибаться, передавая вместо этого логическое значение small-b, потому что я знаю, что примитивное логическое значение никогда не будет нулевым. Я уверен, что есть веские причины для использования логического типа, но я бы хотел подумать о его использовании в каждом случае.

22
ответ дан 29 November 2019 в 01:01
поделиться

Будьте проще. Использование логического значения:

  • добавляет дополнительный уровень сложности
  • принимает логическое значение состояния «истина / ложь» и преобразует его в переменную состояния «истина / ложь / ноль»
  • не дает никаких преимуществ при использовании в качестве логического флага (при условии, что нет взаимодействия с базой данных, как упомянуто BlairHippo)
  • потенциально требует дополнительных строк кода для упаковки / распаковки логических значений в Java 1.4
1
ответ дан 29 November 2019 в 01:01
поделиться

Это связано с базой данных? Если у вас есть логическое значение в базе данных, оно может содержать одно из ТРЕХ значений - true, false и null. Логический объект позволит вам имитировать такое поведение.

По сути, это вопрос того, хотите ли вы иметь дело с «нулем» в качестве потенциального входного значения.

26
ответ дан 29 November 2019 в 01:01
поделиться

На самом деле, как правило, рекомендуется использовать обычные примитивы, если нет особой причины не делать этого. Это будет немного быстрее / менее расточительно, хотя вам нужно будет перемещать много объектов, чтобы это действительно имело значение.

Отвечая на вашу правку, я никогда не слышал, чтобы это было хорошей практикой для общедоступных методов. В часто цитируемой «Эффективной Java» Джоша Блоха есть целый пункт «Предпочитайте примитивные типы упакованным примитивам» (пункт 49, если вы можете достать копию). Похоже, в вашем конкретном случае нет причин отдавать предпочтение использованию логического значения big-b, а использование объектов создает ловушки, такие как плохое взаимодействие со старым кодом, который, например, использует == , а не равно () (что невозможно даже для примитива).

8
ответ дан 29 November 2019 в 01:01
поделиться

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

Если рассматриваемый метод является одним из набора методов с аналогичными сигнатурами, а все остальные передают какой-либо объект в той позиции, где находится ваше логическое , то используется объект, а не примитив может просто быть более последовательным.

РЕДАКТИРОВАТЬ: перечитайте вопрос, если этот логический параметр действительно нужен только для управления if (именно для этого существует примитив), то с помощью объектная форма - это просто пустая трата времени процессора и памяти. Я не могу придумать разумной причины, почему это должен быть объект, а не примитив.

2
ответ дан 29 November 2019 в 01:01
поделиться

Обычно я стараюсь использовать примитивное логическое значение везде, где это возможно.

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

2
ответ дан 29 November 2019 в 01:01
поделиться

Используете ли вы в своем приложении какую-либо структуру привязки данных? Недавно мне пришлось иметь дело со случаем, когда логическое значение в объекте модели необходимо было привязать к форме. Поле в форме было обязательным, но мы не хотели, чтобы значение по умолчанию было истина или ложь (потому что для пользователя было важно выбрать правильное значение для конкретного В случае, если бы было значение по умолчанию, вы легко получили бы множество неверных значений.) Однако, прежде чем объект можно было бы проверить, значения из формы должны были быть привязаны к нему. Конечно, если бы пользователь не выбрал значение, он попытается привязать null к полю, и во время привязки будет выдано исключение. Поэтому мы изменили его на Boolean , чтобы null можно было временно привязать к полю, а затем проверка могла сообщить, что поле является обязательным.

0
ответ дан 29 November 2019 в 01:01
поделиться

Никогда не слышал о какой-либо веской причине предпочитать логическое над логическим .

Если есть шанс, всегда придерживайтесь примитивов. Логические переменные могут быть нулевыми ; и, таким образом, может привести к неожиданному поведению вашего метода. У вашего коллеги могут быть определенные причины, основанные на реализации / логике программы.

2
ответ дан 29 November 2019 в 01:01
поделиться

Основным преимуществом логических значений перед примитивными логическими значениями является то, что они позволяют иметь нулевое значение. Это особенно эффективно для возвращаемых значений, но иногда может использоваться в качестве «необязательного» аргумента в Java.

Убедитесь, что ваши JavaDocs (и код) могут работать с нулевым значением

4
ответ дан 29 November 2019 в 01:01
поделиться

Если вы используете логическое значение, то вы можете передать логическое или логическое значение методу

public void setX(boolean b) //only takes boolean

public void setX(Boolean b) //takes Boolean or boolean

. Это связано с автобоксингом логических значений в функция.

РЕДАКТИРОВАТЬ : автобоксинг работает только в 1.5+

0
ответ дан 29 November 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: