Стандартной практикой является использование примитивов, если вы не имеете дело с генериками (убедитесь, что вы знаете об автобоксах и распаковках !).
Есть несколько веских причин следовать соглашению:
1. Вы избегаете простых ошибок:
Есть некоторые тонкие, не интуитивные случаи, которые часто выявляют новичков. Даже опытные программисты иногда допускают ошибки (возможно, за этим последует ругань, когда они отлаживают код и находят ошибку!).
Наиболее распространенной ошибкой является использование a == b
вместо a.equals(b)
. Люди привыкли работать a == b
с примитивами, поэтому это легко сделать, когда вы используете обертки объектов.
Integer a = new Integer(2);
Integer b = new Integer(2);
if (a == b) { // Should be a.equals(b)
// This never gets executed.
}
Integer c = Integer.valueOf(2);
Integer d = Integer.valueOf(2);
if (c == d) { // Should be a.equals(b), but happens to work with these particular values!
// This will get executed
}
Integer e = 1000;
Integer f = 1000;
if (e == f) { // Should be a.equals(b)
// Whether this gets executed depends on which compiler you use!
}
2. Читабельность:
Рассмотрим следующие два примера. Большинство людей сказали бы, что второе более читабельно.
Integer a = 2;
Integer b = 2;
if (!a.equals(b)) {
// ...
}
int c = 2;
int d = 2;
if (c != d) {
// ...
}
3. Производительность:
Дело в том , что это медленнее использовать обертки объектов для примитивов , чем только с помощью примитивов. Вы добавляете стоимость создания объектов, вызовов методов и т. Д. К вещам, которые вы используете повсеместно .
Цитата Кнута "... скажем, в 97% случаев: преждевременная оптимизация - корень всего зла" на самом деле здесь не применима. Он говорил об оптимизации, которая делает код (или систему) более сложным - если вы согласны с пунктом 2, это оптимизация, которая делает код менее сложным!
4. Это соглашение:
Если вы сделаете другой стилистический выбор для 99% других Java-программистов, у вас будет два недостатка:
- Вам будет труднее читать код других людей. 99% примеров / учебников / и т. Д. Там будут использовать примитивы. Всякий раз, когда вы читаете один, у вас будут дополнительные когнитивные мысли о том, как это будет выглядеть в том стиле, к которому вы привыкли.
- Другим людям будет сложнее читать ваш код. Всякий раз, когда вы задаете вопросы о переполнении стека, вам придется просеивать ответы / комментарии, спрашивая: «Почему вы не используете примитивы?». Если вы мне не верите, просто посмотрите на битвы, которые люди ведут за такие вещи, как размещение скобок, что даже не влияет на сгенерированный код!
Обычно я бы перечислил некоторые контрапункты, но я, честно говоря, не могу придумать каких-либо веских причин не соглашаться здесь!