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

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

Другие упоминали, что некоторые конструкции, такие как Collections требуют объектов, а объекты имеют больше накладных расходов, чем их примитивные копии (память и бокс).

Другое соображение:

Может быть удобно инициализировать объекты в null или отправлять null параметры в метод / конструктор, чтобы указать состояние или функцию. Это невозможно сделать с помощью примитивов.

Многие программисты инициализируют цифры до 0 (по умолчанию) или -1, чтобы обозначить это, но в зависимости от сценария это может быть неправильным или вводящим в заблуждение.

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

Как правило, вы должны использовать примитивные типы, если вам не нужен объект по какой-либо причине (например, для размещения в коллекции). Даже тогда рассмотрите другой подход, который не требует объекта, если вы хотите максимизировать числовую производительность. Это рекомендуется из документации , и эта статья демонстрирует, как автоматическое боксирование может привести к большой разнице в производительности.

На мой взгляд, если мои члены classа являются обертовыми переменными, они не полагаются на значения по умолчанию, что является поведением, совместимым с разработчиками.

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.

Я бы использовал только типы оберток, если вам нужно.

При использовании их вы мало выигрываете, кроме того, что они являются Objects .

И вы теряете накладные расходы на использование памяти и время, потраченное на бокс / распаковку.

Коллекции являются типичным случаем для простых объектов оболочки Java. Однако вы можете подумать о том, чтобы предоставить Wrapper более конкретное значение в коде (объект value).

IMHO почти всегда полезно использовать объекты ценности, когда это сводится к читаемости и поддержанию кода. Обтекание простых структур данных внутри объектов, когда они имеют определенные обязанности, часто упрощает код. Это то, что очень важно для разработки, управляемого доменом .

Конечно, проблема с производительностью, но я, как правило, игнорирую это, пока у меня не будет возможности измерить производительность с надлежащими данными и сделать больше направленных действий в проблемную область. Также может быть проще понять проблему производительности, если код также легко понять.

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

примитивных типов, используется оператор ==, но для обертки предпочтительным является вызов метода equals ().

«Примитивные типы считаются вредными», потому что они смешивают «процессуальную семантику» с однородной объектно-ориентированной моделью.

Многие программисты инициализируют цифры до 0 (по умолчанию) или -1, чтобы обозначить это, но в зависимости от сценария это может быть неправильным или вводящим в заблуждение.

Если вы хотите создать тип значения. Что-то вроде ProductSKU или AirportCode.

Когда примитивный тип (строка в моих примерах) определяет равенство, вы захотите переопределить равенство.

Если вы хотите использовать Коллекции, вы должны использовать classы Wrapper.

Примитивные типы, используются для массивов. Кроме того, чтобы представлять данные, которые не имеют поведения, например, счетчик или логическое условие.

Поскольку autoboxing, граница «когда использовать примитивную или обертку» стала довольно нечеткой.

Но помните, Wrappers – это объекты, поэтому вы получаете все причудливые функции Java. Например, вы можете использовать reflexion для создания объектов Integer, но не int значений. Классы Wrapper также имеют такие методы, как valueOf.

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

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

  1. Если переменная имеет тип long – если не инициализирована, она будет установлена ​​в 0 – это будет запутать пользователя при отображении в графическом интерфейсе
  2. Если переменная имеет тип Long – если не инициализирована, она будет установлена ​​в null – это значение null не будет отображаться в графическом интерфейсе.

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

Interesting Posts
Давайте будем гением компьютера.