В чем реальная разница между примитивами и классами-оболочками в Java - PullRequest
1 голос
/ 07 августа 2020

Я понимаю такие вещи, как:

  1. Класс Wrapper создает объект, а примитив не создает объект
  2. Классы Wrapper используются с коллекциями для представления типа
  3. Wrappers имеют методы и могут содержать адрес памяти / null, а примитивы содержат значения по умолчанию
  4. Примитивы быстрее сравниваются с классами-оболочками, поскольку нет накладных расходов на методы или объект
  5. Как работает автоматическая упаковка и распаковка
  6. Класс-оболочка оборачивает примитивный тип

Однако не удалось понять реальную разницу между примитивами и классами-оболочками. Почему возникла необходимость создать два разных способа хранения данных? Почему мы не использовали то, что уже было доступно? Например, если классы-оболочки были введены до примитивов, то почему мы не использовали классы-оболочки вместо того, чтобы разработать совершенно другой способ для аналогичной цели и наоборот.

Ответы [ 2 ]

6 голосов
/ 07 августа 2020

Реальная разница в том, что примитивные типы не являются ссылочными типами .

В системе типов Java ссылочные типы имеют общий root, а примитивных типов нет: все ссылочные типы являются подтипами Object. Для сравнения, примитивные типы не имеют общего корня; каждый примитивный тип - это свой собственный особый единорог.

Это означает, что переменная, объявленная с типом Object, может содержать значение любого ссылочного типа, но не может содержать значение какого-либо примитивного типа.

Это проблема, если вы хотите создать обычно полезные структуры данных. Подумайте, как бы вы реализовали структуру данных «динамический c массив», такую ​​как ArrayList или Vector. Вы можете использовать массив Object[] для хранения элементов, и это будет работать для всех ссылочных типов. Но поскольку у примитивных типов нет общего root, вам нужно будет создать отдельную реализацию для каждого примитивного типа.

Для решения этой проблемы были созданы классы-оболочки. Теперь, вместо того, чтобы требовать 8 отдельных реализаций массива Dynami c (1 для ссылочных типов и 7 для примитивных типов), вы можете заключить каждое примитивное значение в объект и просто использовать реализацию для ссылочных типов.

Примитивные типы и классы-оболочки были созданы одновременно с созданием первого дизайна и реализации Java 1.0. Дизайнеры не «повторно использовали то, что уже было доступно», потому что ничего не было доступно: они построили все с нуля.

Могли ли дизайнеры решить проблему каким-либо другим способом, возможно, создав систему типов, которая имела root как для примитивных, так и для ссылочных типов? Да, но они этого не сделали, и у них, вероятно, были веские причины: сложность реализации, простота понимания, время выхода на рынок, ...

2 голосов
/ 07 августа 2020

На самом деле, это довольно проницательный вопрос. Ответы хорошие и правильные, но основной вопрос, который, я думаю, стоит задать: должны ли вообще существовать примитивные типы? В то время у нас было много споров по этому поводу, и я думаю, что причина того, что все закончилось так, как они были, связана с тем фактом, что Oak (позже Java) был разработан как встроенный язык для IOT (inte rnet вещей). Если бы он был изначально разработан как серверный язык, он мог бы быть совсем другим. Я думаю, что примитивные типы - это устаревшая идея, которая на самом деле очень вредна именно по тем причинам, которые упоминает Джони. Возможно и желательно, чтобы все в системе расширяло Object.

Как бы вы могли избавиться от примитивов? С более умной JVM. HotSpot мог бы по возможности превращать специальные примитивные объекты в соответствующий машинный код, и не было бы необходимости в автобоксировании, обертках или трудностях с разделяемой системой типов. Единственное ограничение, которое, как мне кажется, должно быть наложено на Integer, Float, Double и т. Д. c., - это то, что они должны быть окончательными. Это позволило бы оптимизировать эти классы везде, где это возможно, как если бы они были примитивами, фактически не имея примитивов в языке. У вас даже могут быть сокращения syntacti c, такие как int, float и double для этих специальных классов, но важно то, что система типов была бы лучше, если бы она была полностью унифицирована.

Но вы не начинаете пытаться построить такую ​​вещь, когда думаете об умных тостерах. То, что случилось с Java с точки зрения его безумного успеха, было чистой случайностью. Это оказалось решением многих проблем, связанных с Интернетом, просто сидящим там в нужное время. Но это не было запланировано таким образом, поэтому есть много вещей, которые люди хотели бы получить обратно. Я думаю, что многие люди в Sun / Oracle задним числом исключили бы примитивы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...