Когда использовать класс-оболочку и примитивный тип


когда я должен пойти на класс-оболочку над примитивными типами? Или на каком обстоятельстве я должен выбрать между типами обертки / примитива?

9 69

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 переменной типа

  1. если переменная имеет тип long - когда он не инициализирован, он будет установлен в 0 - это будет сбивать с толку пользователя при отображении в GUI
  2. если переменная имеет тип Long - если он не инициализирован, он будет установлен в null - это нулевое значение не будет отображаться в ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ.

это относится к Boolean а также Где значения могут быть более запутанными, когда мы используем примитив boolean(значение по умолчанию-false).