использование классов вместо примитивов в java [duplicate]

В Sybase SQL Anywhere:

SELECT TOP 1 START AT n * from table ORDER BY whatever

Не забывайте ORDER BY или это бессмысленно.

68
задан Gopi 27 April 2015 в 12:45
поделиться

9 ответов

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

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

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

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

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

51
ответ дан VPK 22 August 2018 в 08:38
поделиться
  • 1
    «Может быть удобно инициализировать объекты нулевым». Это не может быть удобно, потому что это неверно, если поле является необязательным, вы должны указать это явно. – Eddie Jamsession 22 January 2015 в 10:02
  • 2
    lol @EddieJamsession спасибо, я никогда не буду инициализировать null. (Pfffft) – pstanton 2 February 2015 в 00:49
  • 3
    @EddieJamsession Если инициализация объектов в null как способ указания сбоя при установке фактического значения не удалась, как еще вы предложите поймать эту проблему? О, я просто понял, как я печатаю это: исключения. Исключение NullPointerException является слишком общим; было бы лучше использовать очень конкретные пользовательские исключения, чтобы указать, что пошло не так. Хорошо, я буду делать это с этого момента ... – klaar 16 November 2017 в 09:46
  • 4
    @EddieJamsession После прочтения этого вопроса я столкнулся с концепцией объекта Optional. Правильно. – klaar 16 November 2017 в 10:59

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

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

1
ответ дан Chris Missal 22 August 2018 в 08:38
поделиться
  • 1
    строка не примитивна – pstanton 15 October 2009 в 06:31
  • 2
    все еще есть веские причины для переноса типа значения, содержащего строку в качестве базового объекта. – Chris Missal 15 October 2009 в 06:36
  • 3
    ваш ответ просто не имеет смысла. Я не уверен, что вы говорите. Я согласен с вашим комментарием, хотя классы-оболочки - хорошая идея, если они улучшают удобочитаемость. – pstanton 15 October 2009 в 06:41
  • 4
    Типы значений или объекты ценности должны создаваться и быть неизменными. Например, было бы бессмысленно создавать «CountryCode», object like: new CountryCode («США»), затем создать другой объект таким же образом, где позже они будут разными. Они только начинаются, но у них есть смысл. Используя строки, вы можете их модифицировать (добавив больше данных и т. Д.), Но они больше не будут равны. См. Эту статью для лучшего описания того, что я пытаюсь объяснить :) Надеюсь, это имеет смысл c2.com/cgi/wiki?ValueObject – Chris Missal 15 October 2009 в 07:06

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

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.

7
ответ дан Cody 22 August 2018 в 08:38
поделиться
  • 1
    Шаблон строителя предназначен для этого. В этом случае вы создаете PersonBuilder, который выдает исключение, если SSN не установлен до вызова & quot; build & quot; для получения экземпляра Person. Я думаю, что такого рода вещи чрезмерны, но это то, что язык Java продвигает для правильных шаблонов. – Sandy Chapman 29 February 2016 в 13:13

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

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

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

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

1
ответ дан danopz 22 August 2018 в 08:38
поделиться

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

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

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

6
ответ дан jjnguy 22 August 2018 в 08:38
поделиться
  • 1
    вы можете не получить много, но вы тоже не потеряете. если вы не работаете на пилоте ладони 1990-х годов. – pstanton 15 October 2009 в 06:43
  • 2
    Тот факт, что они являются Объектами, также дает им гораздо больше контекста и инкапсуляции, чем как простой примитив. Таким образом, вы действительно можете многое получить в зависимости от того, для чего предназначены эти примитивы и где они используются. – aberrant80 15 October 2009 в 07:34

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

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

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

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

2
ответ дан loknath 22 August 2018 в 08:38
поделиться

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

12
ответ дан Matthew Flaschen 22 August 2018 в 08:38
поделиться
  • 1
    удар производительности не настолько велик, что четкость / надежность кода следует занять. – pstanton 15 October 2009 в 06:39
  • 2
    Во-первых, использование примитивов должным образом не сделает ваш код неразборчивым. Во-вторых, успех в некоторых случаях является значительным. Абсурдно говорить, что этого никогда не будет. – Matthew Flaschen 15 October 2009 в 07:00
  • 3
    @pstanton: объясните, как Integer более разборчиво, чем int. – Stephen C 15 October 2009 в 08:29
  • 4
    Во многих случаях Integer не более разборчив, чем int, и в этих случаях я всегда буду использовать int, или, если я знаю, что определенная переменная никогда не будет равна null, я буду использовать int, потому что int, как вы указали, немного более эффективен. Однако во многих случаях другому программисту проще понять состояние переменной, когда объект используется, поскольку он может быть инициализирован нулем, чтобы показать, что он не готов. Например, если у вас есть несохраненная запись базы данных, которая имеет уникальный инкрементный числовой идентификатор, должен ли этот идентификатор быть 0, -1 или null, прежде чем ему будет присвоен действительный идентификатор? В этом случае объекты лучше. – pstanton 15 October 2009 в 09:37
  • 5
    Производительность важна при использовании большого объема данных. – Fırat KÜÇÜK 30 December 2011 в 11:13

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

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

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

3
ответ дан Mattias Holmqvist 22 August 2018 в 08:38
поделиться

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

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

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

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

1
ответ дан Tom 22 August 2018 в 08:38
поделиться
  • 1
    Кроме коллекций, я не должен использовать классы-оболочки? Как использовать его для обычного объявления типа Integer i = new Integer (10); Хорошо ли так? – Gopi 15 October 2009 в 06:23
  • 2
    autoboxing позволяет делать Integer i = 10; – Tom 15 October 2009 в 06:25
  • 3
    Нет, Шри. Если у вас нет требования, чтобы я был объектом, не делайте его одним. – Matthew Flaschen 15 October 2009 в 06:30
  • 4
    Автообъект будет освобождать вышеперечисленные объявленные i до int i = 10 или Integer i = 10? – Gopi 15 October 2009 в 06:30
  • 5
    int pi = new Integer (10); работает. Integer oi = 10; работает. int ni = null; не работает. LHS преобразуется в то, что требуется RHS. – pstanton 15 October 2009 в 06:47
Другие вопросы по тегам:

Похожие вопросы: