Как создается экземпляр класса Java Boolean? - PullRequest
9 голосов
/ 03 февраля 2011

В Java, я могу написать код, подобный этому

Boolean b = true ;

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

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

Boolean b = new Boolean( true ) ;

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

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

Foobar foobar = "Test" ; 

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

Спасибо

Ответы [ 6 ]

13 голосов
/ 03 февраля 2011

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

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

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

Из статьи: J2SE 5.0 в двух словах

В «Автобокс и автоматическая распаковка примитивных типов» пример:

До (добавлен автобокс)

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);

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

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

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

3 голосов
/ 03 февраля 2011

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

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

Boolean.valueOf(true);

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

1 голос
/ 03 февраля 2011

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

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

case class Foobar(value: String)
implicit def convertStringToFoobar(s: String) = Foobar(s)
val foobar: Foobar = "Test";
1 голос
/ 03 февраля 2011

Таким же образом вы можете создавать объекты String как таковые:

String s = "foobar"

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

0 голосов
/ 03 февраля 2011

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

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

0 голосов
/ 03 февраля 2011

Нет, это просто магия компилятора; он рассматривает их как особые случаи (известные как autoboxing ). Смотрите, например http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html.

...