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

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

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. Например, можно использовать reflexion для создания целочисленных объектов, но не int значения. Классы-оболочки также имеют такие методы, как valueOf.


практически я столкнулся с ситуацией, когда можно объяснить использование класса обертки.

Я создал класс обслуживания, который имел long переменной типа

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

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