Почему классы-оболочки Java не имеют конструкторов без аргументов? - PullRequest
2 голосов
/ 17 мая 2009

В чем причина отсутствия конструкторов без аргументов в классах Wrapper? Я знаю, что они изначально были созданы для примитивных типов Wrapping, поэтому правильный способ - предоставить примитивный тип для конструкторов.

Однако, учитывая, что у примитивных типов есть конструктор без аргументов, почему у них их нет?

Кроме того, если бы у них были конструкторы без аргументов, их можно было бы создать как T.class.newInstance(). Однако, поскольку newInstance() требует конструктора без аргументов, это не будет работать с классами Wrapper.

Ответы [ 6 ]

11 голосов
/ 17 мая 2009

Объекты-обертки неизменны. Это означает, что если объекту-оболочке присвоено значение, это значение не может быть изменено. Не имеет смысла иметь значение по умолчанию для объекта, значение которого нельзя изменить. Вы бы не хотели получить newInstance() класса-оболочки, потому что тогда вы застряли бы со значением по умолчанию.

2 голосов
/ 17 мая 2009

Нет смысла предоставлять примитивный тип в конструкторе. Тип класса-оболочки указывает тип примитива. Поскольку созданный экземпляр объекта-оболочки не может быть изменен (неизменен), существует только один шанс присвоить ему значение: во время его создания Если объекты класса-оболочки не являются неизменяемыми, могут происходить странные вещи. Если бы у вас был конструктор класса-оболочки по умолчанию, какое его значение было бы?

2 голосов
/ 17 мая 2009

Я думаю, это потому, что значения, заключенные в эти классы, должны быть final неизменными (, что было словом, которое я искал, спасибо Биллу :)). Если бы существовал конструктор по умолчанию, он был бы совершенно бесполезен, поскольку вы не могли бы изменить примитив, обернутый классом позже.

1 голос
/ 17 мая 2009

Только объекты имеют конструкторы, примитивы не имеют конструкторов, поэтому у них нет конструктора по умолчанию. Примитивы получают значение по умолчанию благодаря инициализации объектов / значений для всех 0 байтов. (Что является ложным в логическом, 0,0f в плавающем, 0,0 в двойном и ноль в качестве ссылки)

Похоже, вы хотите создать объект с помощью newInstance (), однако единственное неинициализированное значение равно нулю.

1 голос
/ 17 мая 2009

Лучший вопрос - почему у них вообще есть конструкторы? Мы должны быть просто заинтересованы в стоимости. Идентичность объекта не имеет отношения к значению типов.

Большинство (но не все) использования отражения бессмысленно. Построение неизменной ценности, подобной этой, имело бы очень мало значения. Class.newInstance особенно злой из-за исключительного поведения. T.class где T - универсальный параметр, который не будет компилироваться из-за стирания.

0 голосов
/ 17 мая 2009

Скорее всего, поскольку примитивы имеют значение по умолчанию (0, 0.0f, 0.0, 0L, false и т. Д.), Обертки обычно выражают эти значения по умолчанию как нулевые.

...