2011-02-03 7 views
9

В Java, я могу написать код, как этотКак создается экземпляр класса Java Boolean?

Boolean b = true ; 

И это будет работать. Теперь у меня есть объект, который содержит значение «true».

Как это работает? Почему мне не нужно передавать значение через конструктор? Например:

Boolean b = new Boolean(true) ; 

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

Так что я могу сделать что-то вроде этого:

Foobar foobar = "Test" ; 

И, таким образом, есть свой собственный класс-обертку.

Thanks

+0

Это называется autoboxing. Googling 'java autoboxing' предоставит вам много информации о том, что вы наблюдаете. –

+2

Последняя часть нуждается в более машинном оборудовании, чем Java. В scala, например, это, вероятно, можно было бы сделать с implicits – svrist

+0

Спасибо всем, я никогда не слышал термин «autoboxing» раньше. – CrazyPenguin

ответ

13

Нет, вы не можете сделать последнее.

Первый называется autoboxing и был представлен в Java v1.5 для автоматической обертки, примитивов в их обертке.

Выгода от Autoboxing может быть явно видно при использовании генериков и/или коллекции:

Из статьи: J2SE 5.0 in a Nutshell

В «Autoboxing и Auto-распаковка примитивных типов» образца мы есть:

До (Autoboxing был добавлен)

ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(0, new Integer(42)); 
int total = (list.get(0)).intValue(); 

После

ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(0, 42); 
int total = list.get(0); 

Как вы видите, код более ясен.

Просто имейте в виду последнюю записку о документации:

Так что, когда вы должны использовать Autoboxing и распаковка? Используйте их только при наличии «несоответствия импеданса» между ссылочными типами и примитивами, например, когда вам нужно ввести числовые значения в коллекцию. Нецелесообразно использовать автобоксинг и распаковку для научных вычислений или другой высокопроизводительный численный код. Целое число не является заменой int; autoboxing и unboxing размывают различие между примитивными типами и ссылочными типами, но они не устраняют его.

1

Это тот же способ, что вы можете создавать объекты типа String, как, например:

String s = "foobar" 

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

+0

У меня нет практической необходимости, но я понял, что не знаю, как это работает, и, не зная фразы «autoboxing», было несколько бесплодных поисковых запросов Google – CrazyPenguin

0

Это называется autoboxing и в основном это то, что компилятор делает для вас. Он был добавлен только на Java 5, прежде чем вам нужно было использовать new Boolean(true) или (лучше) Boolean.TRUE.

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

3

Как это работает?

Это компилятор. Компилятор автоматически сгенерирует операцию бокса. Что это на самом деле будет делать это, чтобы генерировать

Boolean.valueOf(true); 

Потому что таким образом существующие (неизменные) экземпляры Boolean.TRUE и Boolean.FALSE будет использоваться вместо создания нового.

1

Эта функция была добавлена ​​в Java 1.5 и называется Autoboxing. Этот вид магии доступен только для примитивных значений и корреспондентских оберток.

И вы не можете сделать это самостоятельно на Java. Если вы все еще этого хотите, чем пойти за Scala - это здорово! А именно, вы можете использовать функцию, называемую implicit conversions. Вот небольшой пример для вашего дела:

case class Foobar(value: String) 
implicit def convertStringToFoobar(s: String) = Foobar(s) 
val foobar: Foobar = "Test"; 
Смежные вопросы