Когда я должен пойти для класса-оболочки над примитивными типами? Или по каким обстоятельствам я должен выбирать между оберткой/примитивными типами?
Когда использовать класс-оболочку и примитивный тип
Ответ 1
Другие отметили, что некоторые конструкции, такие как коллекции, требуют объектов, а у объектов больше накладных расходов, чем их примитивные копии (память и бокс).
Еще одно соображение:
Может быть удобно инициализировать объекты в null или отправить нулевые параметры в метод/конструктор, чтобы указать состояние или функцию. Это невозможно сделать с помощью примитивов.
Многие программисты инициализируют цифры 0 (по умолчанию) или -1, чтобы обозначить это, но в зависимости от сценария это может быть неправильным или вводящим в заблуждение.
Это также установит сцену для исключения NullPointerException, когда что-то используется неправильно, что намного более просто программирует, чем какой-либо произвольный баг в строке.
Ответ 2
Как правило, вы должны использовать примитивные типы, если по какой-либо причине вам не нужен объект (например, чтобы вставить коллекцию). Даже тогда рассмотрите другой подход, который не требует объекта, если вы хотите максимизировать числовую производительность. Это документация, и эта статья демонстрирует, как автоматическое боксирование может привести к большой разнице в производительности.
Ответ 3
Я бы использовал только типы оберток, если вам нужно.
При использовании их вы мало выигрываете, кроме того, что они Objects
.
И вы теряете накладные расходы на использование памяти и время, потраченное на бокс/распаковку.
Ответ 4
На мой взгляд, если мои члены класса являются обертовыми переменными, он не полагается на значения по умолчанию, которые являются дружественными для разработчиков.
1.
class Person {
int SSN ; // gets initialized to zero by default
}
2.
class PersonBetter {
Integer SSN; //gets initialized to null by default
}
В первом случае вы не можете сохранить значение SSN неинициализированным. Это может повредить, если вы не проверяете, было ли значение установлено до того, как вы попытаетесь его использовать.
Во втором случае вы можете сохранить инициализацию SSN нулевым значением. Это может привести к NullPointerException, но лучше, чем неосознанно вставлять значения по умолчанию (ноль) в SSN в базу данных всякий раз, когда вы пытаетесь использовать ее без инициализации поля SSN.
Ответ 5
Коллекции являются типичным случаем для простых объектов оболочки Java. Однако вы можете подумать о том, чтобы предоставить Wrapper более конкретное значение в коде (объект значения).
IMHO почти всегда полезно использовать объекты ценности, когда он сводится к читаемости и поддержанию кода. Обтекание простых структур данных внутри объектов, когда они имеют определенные обязанности, часто упрощает код. Это то, что очень важно в Domain-Driven Design.
Конечно, проблема с производительностью, но я, как правило, игнорирую это, пока у меня не будет возможности измерить производительность с надлежащими данными и сделать больше направленных действий в проблемную область. Также может быть проще понять проблему производительности, если код также легко понять.
Ответ 6
производительность приложений, в которых доминируют численные вычисления, может значительно выиграть от использования примитивов.
примитивные типы, используется оператор ==, но для оболочки предпочтительным является вызов метода equals().
"Примитивные типы считаются вредными" , потому что они смешивают "процедурную семантику" с однородной объектно-ориентированной моделью.
Многие программисты инициализируют цифры до 0 (по умолчанию) или -1, чтобы обозначить это, но в зависимости от сценария это может быть неправильным или вводящим в заблуждение.
Ответ 7
Если вы хотите создать тип значения. Что-то вроде ProductSKU или AirportCode.
Когда примитивный тип (строка в моих примерах) определяет равенство, вам нужно переопределить равенство.
Ответ 8
Практически я столкнулся с ситуацией, когда можно объяснить использование класса-оболочки.
Я создал класс службы, у которого была переменная типа long
- Если переменная имеет тип
long
- если не инициализирована, она будет установлена в 0 - это будет запутать пользователя при отображении в графическом интерфейсе - Если переменная имеет тип
long
- если не инициализирована, она будет установлена вnull
- это значение null не будет отображаться в графическом интерфейсе.
Это относится и к Boolean
, где значения могут быть более запутанными, когда мы используем примитив Boolean
(поскольку значение по умолчанию равно false).
Ответ 9
Если вы хотите использовать Коллекции, вы должны использовать классы Wrapper.
Примитивные типы, используются для массивов. Кроме того, чтобы представлять данные, которые не имеют поведения, например, счетчик или логическое условие.
Поскольку autoboxing, граница "когда использовать примитивную или обертку" стала довольно нечеткой.
Но помните, Wrappers - это объекты, поэтому вы получаете все причудливые функции Java. Например, вы можете использовать reflexion для создания объектов Integer, но не int значений. Классы Wrapper также имеют такие методы, как valueOf.