ТЛ; др
Если у вас нет особого варианта использования, просто используйте:
Integer
для значений бизнес-объектов, переменных-членов класса.
int
для больших объемов необработанных данных.
Просто используйте Integer
Для большинства распространенных бизнес-ориентированных Java-приложений обычной практикой является использование 32-битных int
или Integer
без особых размышлений, если только вы не знаете, что у вас будут значения более 2 миллиардов, в этом случае используйте long
или Long
. На современном обычном оборудовании нет особых причин для беспокойства, используя short
/ Short
.
Особые случаи
Но так как вы спросили «есть ли что-то еще, чтобы принять во внимание во время выбора», вот три особых случая: применение ограничений, перенос кода C и альтернативное оборудование.
Принудительное ограничение
Если вы хотите применить ограничения short
или Short
, используйте эти типы. Выбирайте их, когда вы знаете, что у вас должны быть только значения, меньшие, чем приблизительно 32 000, и хотите, чтобы компилятор или JVM времени выполнения обеспечили это.
Например, добавьте один к 101:
short oneOhOnePlusOne = ( (short) 101 + (short) 1 ) ;
System.out.println( "oneOhOnePlusOne: " + oneOhOnePlusOne ) ;
* * 102 тысяча тридцать-семь
Затем попытайтесь превысить ограничение, чтобы увидеть, как компилятор применяет ограничение.
short shortMaxPlusOne = ( Short.MAX_VALUE + (short) 1 ) ;
System.out.println( "shortMaxPlusOne: " + shortMaxPlusOne ) ;
ошибка: несовместимые типы: возможное преобразование с потерями из int в short
См. Этот код, запущенный в режиме реального времени на IdeOne.com .
Код портирования C
Эти различные числовые типы, вероятно, были введены в Java, чтобы упростить перенос кода на C, как в практическом, так и в психологическом отношении. Изобретатели Java прекрасно понимали, что в ту эпоху большинство попыток создания нового языка программирования терпели неудачу из-за критики о том, что он «не похож на C». Таким образом, Objective-C (вдохновение для Java) и, следовательно, чудовище, которое C ++ .
Так что, действительно, если вы переносите код C, используйте соответствующий тип для репликации поведения.
Кстати ... Технически, C не фактически определяет размер своих числовых типов. На практике практически каждая реализация C использует размеры, как в Java.
Между прочим, даже самые современные языки, такие как Swift и Kotlin имеют встроенные числовые типы для 8, 16, 32 и 64-битных целых чисел.
Более строгие аппаратные средства
Если есть вероятность, что ваше приложение может работать на другом оборудовании, не основанном на x86-64 , то вы можете использовать эти типы. Альтернативные реализации Java для такого оборудования могут лучше оптимизироваться для небольших типов.
Примитив и Объект
Массив примитивов предпочтительнее для сохранения выделенной памяти
Прежде всего, не переживайте по этому поводу. Не попадайтесь в ловушку преждевременной оптимизации . На обычном оборудовании с большинством обычных приложений любая экономия памяти при использовании примитивов по сравнению с объектами, массивами и коллекциями будет незначительной. Используйте тип (примитив / объект) и структуру (массив / коллекцию), соответствующие вашему контексту кодирования.
Моя практика:
- В моем коде объекты.
Используйте только объекты (Integer
, а не int
) в моих собственных классах. У меня есть две причины. Во-первых, я из числа поклонников Объектов, которые хотели бы, чтобы Java была чистой ООП без каких-либо примитивов. (Действительно, продолжаются исследования, чтобы выяснить, могут ли примитивы практически исчезнуть в далекой будущей версии Java.) Во-вторых, я обнаружил, что когда я использовал примитив, мне пришлось использовать его в объектах, требующих контекста, таких как коллекции ,
- С чужим кодом используйте примитивы, если они это делают.
Вне моих собственных классов я не навязываю проблему, так как излишний автобокс бессмыслен. Если внешний код (не мой) использует примитивы, я использую примитивы в этом контексте.