В Sybase SQL Anywhere:
SELECT TOP 1 START AT n * from table ORDER BY whatever
Не забывайте ORDER BY или это бессмысленно.
Другие отметили, что некоторые конструкции, такие как Collections
, требуют объектов и что у объектов больше накладных расходов, чем их примитивные копии (память и бокс).
Другое соображение:
Может быть удобно инициализировать объекты в null
или отправить параметры null
в метод / конструктор, чтобы указать состояние или функцию. Это невозможно сделать с помощью примитивов.
Многие программисты инициализируют цифры до 0 (по умолчанию) или -1, чтобы обозначить это, но в зависимости от сценария это может быть неправильным или вводящим в заблуждение.
Это также установит сцену для NullPointerException
, когда что-то используется неправильно, что намного более просто программирует, чем какой-либо произвольный баг в строке.
Если вы хотите создать тип значения. Что-то вроде ProductSKU или AirportCode.
Когда примитивный тип (строка в моих примерах) определяет равенство, вы хотите переопределить равенство.
На мой взгляд, если мои члены класса являются обертовыми переменными, он не полагается на значения по умолчанию, которые являются дружественными для разработчиков поведения.
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.
PersonBuilder
, который выдает исключение, если SSN не установлен до вызова & quot; build & quot; для получения экземпляра Person
. Я думаю, что такого рода вещи чрезмерны, но это то, что язык Java продвигает для правильных шаблонов.
– Sandy Chapman
29 February 2016 в 13:13
Практически я столкнулся с ситуацией, когда можно объяснить использование класса-оболочки.
Я создал класс обслуживания, у которого была переменная типа long
long
- если она не инициализирована, она будет установлена в 0 - это будет запутывать пользователя при отображении в GUI Long
- если не инициализирована, она будет установлена на null
- это значение null не будет отображаться в GUI. Это относится также к Boolean
, где значения могут быть более запутанными, когда мы используем примитив boolean
(поскольку значение по умолчанию - false).
Я бы использовал только типы оберток, если вам нужно.
При использовании их вы не получаете многого, кроме того, что они Objects
.
И , вы теряете накладные расходы на использование памяти и время, потраченное на бокс / распаковку.
производительность приложений, в которых доминируют численные вычисления, может значительно выиграть от использования примитивов.
примитивные типы, один использует оператор ==, но для обертки предпочтительным выбором является вызов равных ( ).
«Примитивные типы считаются вредными» , потому что они смешивают «процессуальную семантику в однородную объектно-ориентированную модель».
Многие программисты инициализируют номера для 0 (по умолчанию) или -1 для обозначения этого, но в зависимости от сценария это может быть неправильным или вводящим в заблуждение.
Как правило, вы должны использовать примитивные типы, если только вам не нужен объект по какой-либо причине (например, чтобы вставить коллекцию). Даже тогда рассмотрите другой подход, который не требует объекта, если вы хотите максимизировать числовую производительность. Об этом говорится в документации и в этой статье , в которой показано, как автоматический бокс может вызвать большую разницу в производительности.
Коллекции являются типичным случаем для простых объектов оболочки Java. Тем не менее, вы можете подумать о том, чтобы предоставить Wrapper более конкретное значение в коде (объект значения).
IMHO почти всегда полезно использовать объекты значений, когда он сводится к читаемости и сохранению кода. Обтекание простых структур данных внутри объектов, когда они имеют определенные обязанности, часто упрощает код. Это очень важно в Domain-Driven Design .
Конечно, проблема с производительностью, но я, как правило, игнорирую это, пока у меня не будет возможности измерить производительность с надлежащими данными и сделать больше направленных действий в проблемную область. Также может быть проще понять проблему производительности, если код также легко понять.
Если вы хотите использовать Коллекции, вы должны использовать классы Wrapper.
Примитивные типы, используются для массивов. Кроме того, для представления данных, которые не имеют поведения, например, счетчика или логического условия.
Поскольку автобоксинг, граница «когда использовать примитивную или обертку» стала довольно нечеткой.
Но помните, Wrappers - это объекты, поэтому вы получаете все причудливые функции Java. Например, вы можете использовать reflexion для создания объектов Integer, но не int значений. Классы Wrapper также имеют такие методы, как valueOf.