Java boolean
позволяет значения true
и в false
то время как Boolean позволяет true
, false
и null
. Я начал конвертировать мои boolean
s в Boolean
s. Это может вызвать сбои в таких тестах, как
Boolean set = null;
...
if (set) ...
пока тест
if (set != null && set) ...
кажется надуманным и подверженным ошибкам.
Когда, если вообще, полезно ли использовать Boolean
s с нулевыми значениями? Если никогда, то каковы основные преимущества обернутого объекта?
ОБНОВЛЕНИЕ: было так много ценных ответов, что я суммировал некоторые из них в своем собственном ответе. Я в лучшем случае являюсь промежуточным звеном в Java, поэтому я попытался показать то, что мне показалось полезным. Обратите внимание, что вопрос «неправильно сформулирован» (логическое значение не может иметь «нулевое значение»), но я оставил его на тот случай, если у других такое же заблуждение
Boolean
переменной дляnull
подсказок.null
если он действительно используется в качестве третьего состояния.Boolean
- это объект, а Аboolean
- это «скаляр». ЕслиBoolean
ссылка имеет значение null, это означает, что соответствующийBoolean
объект не существует. Вы не можете поместить что-то внутри чего-то, что не существует.Ответы:
Используйте,
boolean
а неBoolean
каждый раз, когда вы можете. Это позволит избежать многихNullPointerException
ошибок и сделает ваш код более надежным.Boolean
полезно, напримерMessageFormat.format()
.источник
Boolean isSchrodingerCatAlive = null;
(извините, не смог устоять;)).Я почти никогда не использую,
Boolean
потому что его семантика расплывчата и неясна. В основном у вас есть логика с тремя состояниями: истина, ложь или неизвестность. Иногда полезно использовать его, когда, например, вы дали пользователю выбор между двумя значениями, а пользователь вообще не ответил, и вы действительно хотите узнать эту информацию (подумайте: столбец базы данных NULLable).Я не вижу причин для конвертации
boolean
в,Boolean
поскольку это приводит к дополнительным затратам памяти, возможности NPE и меньшему количеству ввода. Обычно я использую неловко,BooleanUtils.isTrue()
чтобы немного облегчить мне жизньBoolean
.Единственной причиной существования
Boolean
является возможность иметь коллекцииBoolean
типов (дженерики не допускаютboolean
, как и все другие примитивы).источник
Boolean.TRUE.equals(myBooleanObject)
илиBoolean.FALSE.equals(myBooleanObject)
.true
иfalse
.null
это не состояние объекта, а состояние ссылки на объект.isTrue()
метод ...», что звучит как самая глупая вещь в истории вспомогательных функций. И все же, так или иначе, это полезно ... это самый большой вес здесь.Вау, что на земле? Это только я или все эти ответы неверны или, по крайней мере, вводят в заблуждение?
Логический класс - это оболочка вокруг логического примитивного типа. Использование этой обертки позволяет передавать логическое значение в методе, который принимает объект или универсальный объект. Т.е. вектор.
Логический объект НИКОГДА не может иметь значение null. Если ваша ссылка на логическое значение пуста, это просто означает, что ваш логический аргумент никогда не создавался.
Вы можете найти это полезным: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Boolean.java
Нулевая логическая ссылка должна использоваться только для запуска аналогичной логики, к которой у вас есть любая другая нулевая ссылка. Использование его для логики трех состояний неуклюже.
РЕДАКТИРОВАТЬ: обратите внимание,
Boolean a = true;
это вводящее в заблуждение утверждение. Это действительно что-то ближе к.Boolean a = new Boolean(true);
Пожалуйста, посмотрите автобокс здесь: http://en.wikipedia.org/wiki/Boxing_%28computer_science%29#AutoboxingВозможно, отсюда и большая часть путаницы.
РЕДАКТИРОВАТЬ 2: Пожалуйста, прочитайте комментарии ниже. Если у кого-то есть идея, как изменить мой ответ, чтобы включить это, сделайте это.
источник
Boolean a = true;
) и затем установить значение null (a = null;
). Это может быть не элегантно или мудро, но возможно.Boolean a
; a - указатель на логический объект. Если выa = null;
не установили для своего логического значения значение null, то для вашей ссылки будет установлено значение null. УBoolean a = null; a.booleanValue();
В этом случае, вы никогда даже создали булев объект и , следовательно , он будет бросать NullPointerException. Дайте мне знать, если вам нужна дополнительная инструкция.Boolean a = true;
, он выполняет какую-то магию, которая на самом деле интерпретируется какBoolean a = new Boolean(true);
Thats, возможно, не совсем корректно по соображениям производительности, но вы должны понимать, что Boolean по-прежнему является объектом.Есть три быстрые причины:
true
,false
илиnull
xsd:boolean
объявленные сxsd:nillable="true"
List<Boolean>
- вы не можете использоватьList<boolean>
источник
boolean
» (стиль мышления), потому что в Oracle вы обычно используете значенияchar(1) null
«T» и «F». Так что это может (например, с адаптером типа Hibernate) быть нулевым :)ОТВЕТ НА СВОЙ ВОПРОС: Я подумал, что было бы полезно ответить на мой собственный вопрос, поскольку я многому научился из ответов. Этот ответ призван помочь тем, кто, как и я, не имеет полного понимания проблем. Если я использую неправильный язык, пожалуйста, поправьте меня.
true
иfalse
. Это отсутствие указателя на объекты. Поэтому думать, что логическое 3-значное, в корне неверноСинтаксис Boolean сокращен и скрывает тот факт, что ссылка указывает на Object:
Boolean a = true;
скрывает тот факт, что
true
является объектом. Другие эквивалентные назначения могут быть:или
Сокращенный синтаксис
if (a) ...
отличается от большинства других назначений и скрывает тот факт, что a может быть ссылкой на объект или примитивом. Если объект необходимо проверить,
null
чтобы избежать NPE. Мне психологически легче запомнить это, если есть тест на равенство:if (a == true) ...
где нам может быть предложено проверить на ноль. Таким образом, сокращенная форма безопасна только тогда, когда
a
она примитивна.Для себя у меня теперь есть рекомендации:
Boolean
из метода, каким он мог бы бытьnull
. Только вернисьboolean
.Boolean
для обертывания элементов в контейнерах или аргументов методов, где требуются объектыисточник
Классы обертки для примитивов могут использоваться там, где требуются объекты, и коллекции являются хорошим примером.
Представьте, что вам нужно по какой-то причине сохранить последовательность
boolean
вArrayList
, это можно сделать, поместивboolean
в боксBoolean
.Существует несколько слов об этом здесь
Из документации:
http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
источник
Boolean
обертка полезна , когда вы хотите , было ли назначено значение или нет , кромеtrue
иfalse
. Он имеет следующие три состояния:null
Принимая во внимание, что
boolean
есть только два государства:Выше разница будет сделать его полезным в списках
Boolean
значений, которые могут иметьTrue
,False
илиNull
.источник
Я предполагаю, что в некоторых случаях у вас должен быть механизм для различения логического поля, которое уже установило значение или нет.
источник
Основным назначением для логического значения является нулевое значение. Нулевое значение говорит о том, что свойство не определено , например, взять столбец базы данных, обнуляемый.
Если вам действительно нужно преобразовать все из примитивного логического значения в логическое значение оболочки, то вы можете использовать следующее для поддержки старого кода:
источник
Существует множество вариантов использования значения ** null ** в булевой оболочке! :)
Например, вы можете иметь в форме поле с именем «информационный бюллетень», которое указывает, хочет ли пользователь получать информационный бюллетень с вашего сайта или нет. Если пользователь не выбирает значение в этом поле, вы можете реализовать поведение по умолчанию для этой ситуации (отправить? Не отправлять?, Вопрос снова? И т. Д.). Понятно, что не установлено (или не выбрано или ** null **), это не то же самое, что true или false.
Но, если «не установлено» не относится к вашей модели, не меняйте логический примитив;)
источник
В строгом определении логического элемента есть только два значения. В идеальном мире это было бы правдой. В реальном мире элемент может отсутствовать или быть неизвестным. Как правило, это включает в себя пользовательский ввод. В экранной системе это может быть вызвано редактированием. В пакетном мире, использующем либо базу данных, либо вход XML, элемент может легко отсутствовать.
Итак, в неидеальном мире, в котором мы живем, логический объект великолепен тем, что может представлять отсутствующее или неизвестное состояние как нулевое. В конце концов, компьютеры просто моделируют реальный мир и должны учитывать все возможные состояния и обрабатывать их с помощью исключения исключения (в основном, поскольку существуют случаи, когда выброс исключения будет правильным ответом).
В моем случае логический объект был идеальным ответом, поскольку во входном XML иногда отсутствовал элемент, и я все еще мог получить значение, присвоить ему логическое значение, а затем проверить на нулевое значение, прежде чем пытаться использовать с ним истинный или ложный тест. ,
Просто мои 2 цента.
источник
Для всех хороших ответов выше, я просто приведу конкретный пример в
HttpSession
классе сервлетов Java . Надеюсь, этот пример поможет прояснить некоторые вопросы, которые могут у вас возникнуть.Если вам нужно сохранить и получить значения для сеанса, вы используете
setAttribute
(String, Object) иgetAttribute
(String, Object) метод. Поэтому для логического значения вы вынуждены использовать логический класс, если хотите сохранить его в сеансе http.Последняя строка будет вызывать,
NullPointerException
если значения атрибута не установлены. (что и привело меня к этому посту). Таким образом, 3 логических состояния здесь, чтобы остаться, предпочитаете ли вы использовать его или нет.источник
Лучшим способом было бы полностью избежать логических выражений, поскольку каждое логическое подразумевает, что у вас есть условный оператор где-либо еще в вашем коде (см. Http://www.antiifcampaign.com/ и этот вопрос: можете ли вы написать любой алгоритм без оператора if ? )
Тем не менее, прагматически вы должны время от времени использовать логические значения, но, как вы уже убедились, работа с логическими значениями более подвержена ошибкам и более обременительна. Поэтому я бы предложил использовать логические значения везде, где это возможно. Исключениями из этого может быть устаревшая база данных с обнуляемыми логическими столбцами, хотя я бы попытался скрыть это и в своем отображении.
источник
Логическое значение может быть очень полезным, когда вам нужно три состояния. Как и в тестировании программного обеспечения, если Тест пройден, отправьте true, если не удалось отправить false и если тестовый случай прерван, отправьте null, что будет означать, что тестовый случай не выполнен.
источник