Коллега попросил, чтобы я изменил подпись от использования примитивной "булевской переменной" к использованию классифицируемой "булевской переменной". Он не предложил очень хорошее объяснение почему?
Какой-либо из Вас услышал об этом, и какой-либо из Вас может объяснить, почему это имеет значение или не имеет значения?
Править: Он упомянул, что это была хорошая практика для открытых методов.
Использование поля является просто флагом, который говорит мне, назвать ли один поток или другого в зависимости от того, является ли это TRUE или FALSE.
На самом деле я склонен ошибаться, передавая вместо этого логическое значение small-b, потому что я знаю, что примитивное логическое значение никогда не будет нулевым. Я уверен, что есть веские причины для использования логического типа, но я бы хотел подумать о его использовании в каждом случае.
Будьте проще. Использование логического значения:
Это связано с базой данных? Если у вас есть логическое значение в базе данных, оно может содержать одно из ТРЕХ значений - true, false и null. Логический объект позволит вам имитировать такое поведение.
По сути, это вопрос того, хотите ли вы иметь дело с «нулем» в качестве потенциального входного значения.
На самом деле, как правило, рекомендуется использовать обычные примитивы, если нет особой причины не делать этого. Это будет немного быстрее / менее расточительно, хотя вам нужно будет перемещать много объектов, чтобы это действительно имело значение.
Отвечая на вашу правку, я никогда не слышал, чтобы это было хорошей практикой для общедоступных методов. В часто цитируемой «Эффективной Java» Джоша Блоха есть целый пункт «Предпочитайте примитивные типы упакованным примитивам» (пункт 49, если вы можете достать копию). Похоже, в вашем конкретном случае нет причин отдавать предпочтение использованию логического значения big-b, а использование объектов создает ловушки, такие как плохое взаимодействие со старым кодом, который, например, использует ==
, а не равно ()
(что невозможно даже для примитива).
Если вы управляете обеими сторонами интерфейса (то есть вызывающим кодом и вызываемым методом), вы должны просто быть последовательными. На самом деле вы понесете небольшие накладные расходы, если заставите компилятор автоматически упаковать переменную за вас.
Если рассматриваемый метод является одним из набора методов с аналогичными сигнатурами, а все остальные передают какой-либо объект в той позиции, где находится ваше логическое
, то используется объект, а не примитив может просто быть более последовательным.
РЕДАКТИРОВАТЬ: перечитайте вопрос, если этот логический
параметр действительно нужен только для управления if
(именно для этого существует примитив), то с помощью объектная форма - это просто пустая трата времени процессора и памяти. Я не могу придумать разумной причины, почему это должен быть объект, а не примитив.
Обычно я стараюсь использовать примитивное логическое значение везде, где это возможно.
Единственная возможность, которую я могу придумать, чтобы разработчик захотел использовать класс Boolean, - это упаковка / распаковка (но я бы подумал, что вы хотели бы предотвратить упаковку / распаковку, когда это возможно, а не поощрять ее повсюду) и возможность для нулевых значений .
Используете ли вы в своем приложении какую-либо структуру привязки данных? Недавно мне пришлось иметь дело со случаем, когда логическое значение
в объекте модели необходимо было привязать к форме. Поле в форме было обязательным, но мы не хотели, чтобы значение по умолчанию было истина
или ложь
(потому что для пользователя было важно выбрать правильное значение для конкретного В случае, если бы было значение по умолчанию, вы легко получили бы множество неверных значений.) Однако, прежде чем объект можно было бы проверить, значения из формы должны были быть привязаны к нему. Конечно, если бы пользователь не выбрал значение, он попытается привязать null
к полю, и во время привязки будет выдано исключение. Поэтому мы изменили его на Boolean
, чтобы null
можно было временно привязать к полю, а затем проверка могла сообщить, что поле является обязательным.
Никогда не слышал о какой-либо веской причине предпочитать логическое
над логическим
.
Если есть шанс, всегда придерживайтесь примитивов. Логические переменные могут быть нулевыми
; и, таким образом, может привести к неожиданному поведению вашего метода. У вашего коллеги могут быть определенные причины, основанные на реализации / логике программы.
Основным преимуществом логических значений перед примитивными логическими значениями является то, что они позволяют иметь нулевое значение. Это особенно эффективно для возвращаемых значений, но иногда может использоваться в качестве «необязательного» аргумента в Java.
Убедитесь, что ваши JavaDocs (и код) могут работать с нулевым значением
Если вы используете логическое значение, то вы можете передать логическое или логическое значение методу
public void setX(boolean b) //only takes boolean
public void setX(Boolean b) //takes Boolean or boolean
. Это связано с автобоксингом логических значений в функция.
РЕДАКТИРОВАТЬ : автобоксинг работает только в 1.5+