2013-09-23 3 views
4

Когда я должен использовать Boolean вместо boolean ?. Я имею в виду, почему я хочу иметь нулевое значение в переменной, которая должна содержать либо «true», либо «false». Один спонтанный ответ (большинства людей) был бы, если значение неизвестно. т. е. если мы не знаем, истинно или ложно. Но с точки зрения программирования я думаю, что использование Boolean может нарушить код, поскольку мы не будем знать, что внутри. Итак, я думаю, что использование примитивного типа лучше, чем обертка. Исправьте меня, если я ошибаюсь.Когда следует использовать Boolean вместо boolean?

+0

большинства людей это ваш ответ здесь. – Thilo

+1

Я не согласен с двойным закрытием; этот вопрос неверно назван и больше спрашивает о 'boolean' против' int'. – chrylis

ответ

9

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

  • Коллекция. Это теперь подмножество следующего случая, но даже до Java 5 классы Collections только поддерживали объекты как ключи и значения, и это не изменилось.
  • Generics. Общие типы могут работать только с объектами, а не с примитивами, и поэтому, если вы используете «boolean» в качестве параметра типа, он должен быть классом-оболочкой. Например, если вы используете Future, вы должны использовать Boolean вместо boolean. (HT @ user949300)
  • ORM. JPA и другие системы ORM технически могут использовать примитивные поля, но обычно принято использовать классы-оболочки, так как накладные расходы достаточно высоки, что на самом деле не имеет никакого значения, и классы-оболочки могут представлять значение NULL, которое может присутствовать в база данных.

Поскольку логические значения ограничены либо true или false, это редкость, чтобы увидеть их использовали в коллекциях или дженериков; вообще говоря, если бы вы имели значение boolean как значение, вместо этого вы просто используете Collection#contains.

+1

+1 Хорошая точка в Generics. Пример, если длительный процесс (Будущее) должен вернуть true/false, он должен возвращать логическое, а не логическое. – user949300

0

Что делать, если вам нужно использовать коллекции? Коллекция не будет хранить примитивные типы, вам нужно сохранить там объект. Коллекции предоставляют так много полезности apis, поэтому, если вы хотите использовать их, необходим объект Boolean, поскольку коллекции нужны объекты. Хотя вы всегда можете использовать автобоксинг, что означает, что вы защищены от создания объекта, и сборщик заботится о нем внутренне.

7

IMHO примитив лучше.

Всегда предпочитайте примитивы поверх оберток. Там, где я могу использовать примитивы, я им нахожусь, потому что во время выполнения, если мы используем обертки, происходят boxing conversions и unboxing conversions, и, очевидно, это занимает больше времени. Если вы используете примитив, вы сохраните это время.

И как обычно это зависит от ваших требований, нужно ли Object (который может быть null), или вы можете использовать примитивные (который не может быть null) в вашей ситуации.

Например: предположим, что вы имеете дело с коллекцией, тогда у вас нет опции, вы должны использовать обертки :).

+1

Что делать, если вам нужно «null»? Это должно быть единственным соображением. «Экономия времени или памяти» - это не проблема с Boolean, у которой есть только два статических экземпляра, которые уже созданы до того, как ваша программа даже начнет работать. – Thilo

+0

@Thilo True. Вот почему я использовал термин Object, который может быть «null». –

+1

Согласен с @Thilo. Хотя есть веские причины для предпочтения примитивов поверх оболочек, производительность редко возникает, особенно с булевыми. Не понимаю, почему этот ответ получает все голоса. – user949300

0

Классы Wrapper будут в тех случаях, когда объект требуется или настоятельно рекомендуется хранить в объектах в коллекциях, кеше или сеансе и т. Д., Где требуется объект (если нет, JRE преобразует примитивы в классы Wrapper, прежде чем они хранятся во вторичном кэше). Ниже ссылка будет объяснить лучше:

Boolean vs boolean in Java

3

Логическое есть 3 возможных значения (NULL, истина, ложь) в то время как логическое может быть только (истина, ложь).

0

Boolean - это объект, поэтому вы можете использовать его с дженериками. Например, вы можете иметь Map<String,Boolean> для хранения значения true \ false для каждой строки (= key). Вы не можете сделать Map<String,boolean>, потому что boolean не объект - в частности, это не подкласс Object. Дженерики являются обертками времени компиляции, поэтому Map<Foo,Bar> на самом деле Map<Object,Object> с умным литьем, независимо от того, что Foo и Bar - до тех пор, пока они являются классами или типами массивов. Но они не могут быть примитивными.

3

Я очень предпочитаю примитивы. Однако Booleans необходимы:

  1. Когда они идут в коллекции
  2. Если вам необходимо обеспечить нулевое значение. По моему опыту, это в основном, если они хранятся в базе данных, и вам нужно указать нуль, чтобы указать, что они еще не были прочитаны, или пользователь еще не заполнил какую-либо форму.
-1

Booolean - это объект/ссылочный тип, который обертывает логическое значение, тогда как boolean в примитивном типе.

Boolean - Вы получите больше методов, которые будут полезны.

boolean - Сэкономит вам много памяти. Но если вы используете Boolean.valueOf(value) of new Boolean(value), это не должно быть причиной.

Преобразование между примитивами и объектами, подобными этому, известно как бокс/распаковка.

Нажмите на ссылку ниже для получения дополнительной информации:

http://javaeye.wordpress.com/2008/06/17/boxing-and-unboxing-conversion/

http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html спонтанный ответ

http://www.javapractices.com/topic/TopicAction.do?Id=197

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