Когда использовать класс-оболочку и примитивный тип
когда я должен пойти на класс-оболочку над примитивными типами? Или на каком обстоятельстве я должен выбрать между типами обертки / примитива?
9 ответов:
уже упоминалось, что некоторые конструкции, такие как
Collections
требуют объектов и что объекты имеют больше накладных расходов, чем их примитивные аналоги (память и бокс).еще одно соображение:
это может быть удобно для инициализации объектов в
null
или отправитьnull
параметры в метод/конструктор для обозначения состояния или функции. Это не может быть сделано с примитивами.многие программисты инициализируют числа до 0 (по умолчанию) или -1 для обозначения это, но в зависимости от сценария, это может быть неверным или вводящим в заблуждение.
Это также установит сцену для
NullPointerException
когда что-то используется неправильно, что гораздо более удобно для программиста, чем какая-то произвольная ошибка в строке.
Как правило, вы должны использовать примитивные типы, если вы не нужно объект по какой-то причине (например, чтобы положить в коллекцию). Даже тогда рассмотрите другой подход, который не требует объекта, если вы хотите максимизировать числовую производительность. Об этом сообщает документация и в этой статье демонстрирует, как авто-бокс может вызвать большую разницу в производительности.
на мой взгляд, если мои члены класса являются переменными оболочки, он не зависит от значений по умолчанию, что является дружественным к разработчику поведением.
1.
class Person { int SSN ; // gets initialized to zero by default }
2.
class PersonBetter { Integer SSN; //gets initialized to null by default }
в первом случае нельзя сохранить значение SSN неинициализированным. Это может повредить, если вы не проверяете, если значение было установлено, прежде чем пытаться использовать его.
во втором случае SSN можно инициализировать с помощью null. Что может привести к NullPointerException но это лучше, чем неосознанно вставлять значения по умолчанию(ноль) в качестве SSN в базу данных всякий раз, когда вы пытаетесь использовать его без инициализации поля SSN.
Я бы использовал только типы обертки, если вам нужно.
в использовании их вы не получите много, кроме того, что они
Objects
.и вы теряете накладные расходы на использование памяти и время, потраченное на бокс/распаковку.
коллекции являются типичным случаем для простых объектов-оболочек Java. Однако вы можете рассмотреть возможность придания оболочке более конкретного значения в коде (объект value).
IMHO почти всегда полезно использовать объекты value, когда это сводится к удобочитаемости и обслуживанию кода. Обертывание простых структур данных внутри объектов, когда они имеют определенные обязанности, часто упрощает код. Это то, что очень важно в Домен-Управляемая Конструкция.
конечно, есть проблема производительности, но я склонен игнорировать это, пока у меня нет возможности измерить производительность с помощью надлежащих данных и сделать более направленные действия в проблемной области. Также может быть проще понять проблему производительности, если код также легко понять.
производительность из приложений, в которых преобладают численные расчеты, могут значительно выиграть от использования примитивов.
примитивные типы, используется оператор==, но для оболочки предпочтительным выбором является вызов метода equals ().
"примитивные типы считаются вредными" потому что они смешивают "процедурную семантику в Иначе однородную объектно-ориентированную модель.
многие программисты инициализировать цифры до 0 (по умолчанию) или -1, чтобы обозначить это, но в зависимости от сценария, это может быть неверно или вводит в заблуждение.
Если вы хотите создать тип значения. Что-то вроде ProductSKU или AirportCode.
когда примитивный тип (строка в моих примерах) определяет равенство, вы захотите переопределить равенство.
Если вы хотите использовать коллекции, вам должны использовать классы-оболочки.
примитивные типы используются для массивов. Кроме того,для представления данных, которые не имеют поведения, например, счетчик или логическое условие.
с момента автобоксинга граница" когда использовать примитив или обертку " стала довольно нечеткой.
но помните, что обертки-это объекты, поэтому вы получаете все причудливые функции Java. Например, можно использовать отражение для создания целочисленных объектов, но не int значения. Классы-оболочки также имеют такие методы, как valueOf.
практически я столкнулся с ситуацией, когда использование класса обертки можно объяснить.
Я создал класс обслуживания, который имел
long
переменной типа
- если переменная имеет тип
long
- когда он не инициализирован, он будет установлен в 0 - это будет сбивать с толку пользователя при отображении в GUI- если переменная имеет тип
Long
- если он не инициализирован, он будет установлен вnull
- это нулевое значение не будет отображаться в ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ.это относится к
Boolean
а также Где значения могут быть более запутанными, когда мы используем примитивboolean
(значение по умолчанию-false).