Я смущен, когда использовать Java в примитивных или не примитивных (?) Типах (т.е. int vs. Integer). Я понимаю, что в некоторых местах вы не можете использовать примитивные типы (например, при использовании дженериков ). Но как насчет «нормального» кода? Существует ли ограничение производительности при использовании не-примитивных типов? Как насчет работы с Android?
*** Мой вопрос очень похож на этот вопрос , который был обнаружен одним из плакатов ниже. Ответы на связанный вопрос дают дополнительную информацию по этому вопросу, которые не рассматриваются ниже.
*** «непримитивные» типы официально называются ссылочными типами.
Короткий ответ: int
– это число; Integer
– это указатель, который может ссылаться на объект, содержащий число. Использование Integer
для арифметики включает в себя больше циклов процессора и потребляет больше памяти. int
не является объектом и не может передаваться ни одному методу, который требует объектов (точно так же, как вы говорили об Generics).
Непримитивные типы – это объекты. Они должны быть динамически распределены, сбор мусора и проверены на отсутствие (хотя некоторые из этих операций могут быть удалены оптимизирующим компилятором). Чтение их фактического значения требует загрузки с указателя. Примитивные типы – это значения. Обычно они занимают меньше места и быстрее доступны.
Хорошим правилом является использование примитивных типов, если вам не нужен полиморфизм, и в этом случае используйте соответствующий объект.
Существует небольшое ограничение для преобразования между типами ( автобоксинг ). Кроме того, у int
будет немного меньше накладных расходов, поэтому я бы всегда пошел с int
если можно.
Также см. Этот вопрос: когда использовать примитив и когда ссылочные типы в Java
Как пурист OO, вы, вероятно, вообще избегаете примитивов и бремя производительности и отсутствия постфиксных операторов. (Да, есть стоимость исполнения.) Вы также можете использовать этот подход просто из соображений расширяемости как конструктора (не обязательно быть зависшим от чистоты).
Как практический вопрос (вне теоретических и эстетических вопросов), используйте примитивы везде, где можете, и используйте версию объекта, где вы не можете использовать примитивы. (Вы уже упоминали один такой случай. Язык и API будут принимать это решение.)
Как урод производительности, вы, вероятно, избегаете версий объектов, и вам может не понравиться слишком глубоко, если вы наберете несколько золотых правил OO и непринужденные действия: производительность короля, и вы принимаете свои решения соответствующим образом.
Я бы рекомендовал вариант 2 как хорошее место для начала, пока вы не разработали свои собственные догматические предпочтения! 🙂
Мое представление: использование Integer в качестве параметров или возвращаемых значений позволяет одно, что примитивные ints не позволяют: использование null
. Но это хорошая идея? Я думаю, что это редко бывает.
Что касается производительности: компилятор в какой-то степени оптимизирует ваш код, так что большую часть времени это не проблема.