Я вижу, что Java имеет логическое (класс) против логического (примитив). Аналогично, есть Integer (класс) против int (примитив). Как лучше всего использовать примитивную версию против класса? Должен ли я в основном всегда использовать версию класса, если у меня нет конкретной причины (производительности?), Чтобы не делать этого? Какой самый распространенный и приемлемый способ использования каждого?
54
Ответы:
В пункте 5 «Эффективной Явы» Джошуа Блох говорит
Одно хорошее применение для классов - это когда они используются как универсальные типы (включая классы Collection, такие как списки и карты) или когда вы хотите преобразовать их в другой тип без неявного приведения (например,
Integer
класс имеет методыdoubleValue()
илиbyteValue()
.Изменить: причина Джошуа Блоха является:
источник
Стандартной практикой является использование примитивов, если вы не имеете дело с генериками (убедитесь, что вы знаете об автобоксах и распаковках !).
Есть несколько веских причин следовать соглашению:
1. Вы избегаете простых ошибок:
Есть некоторые тонкие, не интуитивные случаи, которые часто выявляют новичков. Даже опытные программисты иногда допускают ошибки (возможно, за этим последует ругань, когда они отлаживают код и находят ошибку!).
Наиболее распространенной ошибкой является использование
a == b
вместоa.equals(b)
. Люди привыкли работатьa == b
с примитивами, поэтому это легко сделать, когда вы используете обертки объектов.2. Читабельность:
Рассмотрим следующие два примера. Большинство людей сказали бы, что второе более читабельно.
3. Производительность:
Дело в том , что это медленнее использовать обертки объектов для примитивов , чем только с помощью примитивов. Вы добавляете стоимость создания объектов, вызовов методов и т. Д. К вещам, которые вы используете повсеместно .
Цитата Кнута "... скажем, в 97% случаев: преждевременная оптимизация - корень всего зла" на самом деле здесь не применима. Он говорил об оптимизации, которая делает код (или систему) более сложным - если вы согласны с пунктом 2, это оптимизация, которая делает код менее сложным!
4. Это соглашение:
Если вы сделаете другой стилистический выбор для 99% других Java-программистов, у вас будет два недостатка:
Обычно я бы перечислил некоторые контрапункты, но я, честно говоря, не могу придумать каких-либо веских причин не соглашаться здесь!
источник
==
. Объекты должны быть сопоставлены сequals()
.equals()
... вы даете им обходной путь, чтобы сравнение объектов с==
ожидаемыми результатами.equals()
второй фрагмент кода и изменил свой голос.Обычно я иду с примитивами. Тем не менее, одной из особенностей использования таких классов, как
Integer
иBoolean
является возможность присваиванияnull
этим переменным. Конечно, это означает, что вы должны выполнятьnull
проверки постоянно, но все же лучше получить исключение NullPointerException, чем иметь логические ошибки из-за использования некоторой переменнойint
илиboolean
переменной, которая не была правильно инициализирована.Конечно, начиная с Java 8 вы можете (и, вероятно, должны) пойти еще дальше и вместо, например
Integer
, можете использоватьOptional<Integer>
переменные, которые могут иметь или не иметь значение.Кроме того, он предоставляет возможность использовать
null
для присвоения этим переменным значение « неизвестно » или « подстановочный знак ». Это может быть полезно в некоторых ситуациях, например, в Ternary Logic . Или вы можете проверить, соответствует ли определенный объект некоторому шаблону; в этом случае вы можете использоватьnull
те переменные в шаблоне, которые могут иметь любое значение в объекте.источник
null
по умолчанию. Напротив: вам лучше не «инициализировать» переменную вообще. Установка любого значения по умолчанию дажеnull
закрывает компилятор ... но также не позволяет обнаружить отсутствие полезного назначения по всем путям кода. Таким образом, ошибка, которую мог поймать компилятор, ускользает во время выполнения.0.0
, или-1
, илиInteger.MAX_VALUE
, илиFalse
, но, в конце концов, вы не знаете, является ли это значением по умолчанию или фактическим значением, которое было присвоено этой переменной. В тех случаях, когда это важно,null
значение может быть более понятным.null
приходят с целым рядом проблем, включая нулевую паранойю.) Внутри функции переменная, которая может быть фактически неинициализирована в момент использования, обычно указывает на раскрытые случаи. (Определенный анализ назначений является упрощенным, поэтому возможны ложные срабатывания. Но вы часто можете их разрешить, упрощая логику, поэтому.)По словам непрофессионала:
Вы используете обертки, когда вам нужно добавить вещи в коллекции.
Коллекции не могут содержать примитивы.
источник
Java поддерживает авто-бокс, как указал m3th0dman. Подумайте о самом низком из возможных уровней, и вы увидите, что при автоматической упаковке (в или из) примитивное значение будет означать тактовые циклы, затрачиваемые на некоторые задачи, которые вам не нужны, если вы работаете с собственными типами данных вокруг своего приложения.
Как правило, вы должны стараться использовать собственные типы данных, когда это возможно.
источник