2010-04-26 2 views
23

Сотрудник попросил меня изменить подпись с использованием примитивного «логического» на использование классифицированного «булева». Почему он не объяснил, почему?Почему я должен передавать Boolean как параметр вместо «boolean»?

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

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

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

+0

См. Http://stackoverflow.com/questions/1295170/whats-the-difference-between-boolean-and-boolean-in-java и смотрите также: http://stackoverflow.com/questions/2306257/boolean-instanceof-object-is-true – Shog9

+0

Не точный обман, OP запрашивает преимущество (dis) одного над другим, а не только разницу. – kennytm

+0

@ Shog9 - Это не дубликат вопроса, который вы указали выше. Я не прошу разницы между булевым и логическим, я знаю разницу. Мой вопрос заключается в том, существует ли какой-то стандарт де-факто или что-то, чего я не знаю, из-за этого вам следует использовать «Boolean» для типов параметров публичных методов. –

ответ

22

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

+1

Вам не придется иметь дело с боксами и распаковкой, а также при использовании 'Boolean'? –

+0

Да, я знаю, я думаю, что «boolean» отлично, потому что это всего лишь флаг управления потоком. –

+0

@ Адам Робинсон - Да, вы бы (см. Мой ответ), что делает это предпочтение еще более озадачивающим меня. –

25

Связано ли это с базой данных? Если у вас есть логическое значение в базе данных, оно может содержать одно из значений THREE - true, false и null. Объект Boolean позволит вам имитировать это поведение.

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

+0

+1 Если у вас есть тайна трехзначной переменной, логический путь, безусловно, правильный путь. –

+6

@Jim: на самом деле, когда вам нужно представить 3-значную переменную, я бы утвердил, что Boolean - это именно то, чего вы не хотите использовать. Это нарушает принцип наименьшего удивления - люди ожидают, что boolean будет иметь 2 состояния. – rmeador

8

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

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

2

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

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

2

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

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

EDIT: Перечитывая вопрос, если этот параметр boolean действительно только там, чтобы контролировать if (который является именно то, что примитив там), а затем, используя форму объекта, просто пустая трата процессорного времени и памяти , Я не могу думать о разумной причине, почему это должен быть объект, а не примитив.

4

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

Убедитесь, что ваш JavaDocs (и код) может иметь дело с нулевой

2

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

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

0

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

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

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

Это связанно с Autoboxing из булевых в функцию.

EDIT: Autoboxing работает только в 1.5+

+0

Хорошая точка, но не в 1.4 –

1

Держите его просто. Использование Boolean:

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

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

Смежные вопросы