A prática padrão é usar as primitivas, a menos que você esteja lidando com genéricos (certifique-se de estar ciente de autoboxing e unboxing !).
Existem várias boas razões para seguir a convenção:
1. Você evita erros simples:
Existem alguns casos sutis, não intuitivos, que muitas vezes pegam iniciantes. Mesmo programadores experientes se enganam e cometem esses erros algumas vezes (esperamos que isso seja seguido de palavrões quando eles depurarem o código e encontrarem o erro!).
O erro mais comum é usar a == b
em vez de a.equals(b)
. As pessoas estão acostumadas a fazer a == b
com primitivas, então é fácil de fazer quando você está usando os wrappers Object.
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. Legibilidade:
Considere os dois exemplos a seguir. A maioria das pessoas diria que o segundo é mais legível.
Integer a = 2;
Integer b = 2;
if (!a.equals(b)) {
// ...
}
int c = 2;
int d = 2;
if (c != d) {
// ...
}
3. Desempenho:
O fato é que é mais lento para usar os wrappers do Object para primitivos do que apenas usar os primitivos. Você está adicionando o custo da instanciação de objetos, chamadas de método, etc. às coisas que você usa em todo o lugar .
Knuth's "... digamos 97% do tempo: a otimização prematura é a raiz de todo o mal", a citação não se aplica realmente aqui. Ele estava falando sobre otimizações que tornam o código (ou sistema) mais complicado - se você concorda com o ponto # 2, esta é uma otimização que torna o código menos complicado!
4. É a convenção:
Se você faz escolhas estilísticas diferentes para 99% dos outros programadores Java, existem duas desvantagens:
- Você encontrará o código de outras pessoas mais difícil de ler. 99% dos exemplos / tutoriais / etc por aí usarão primitivos. Sempre que você lê um, você tem a sobrecarga cognitiva extra de pensar sobre como ele ficaria no estilo que você está acostumado.
- Outras pessoas acharão seu código mais difícil de ler. Sempre que você fizer perguntas sobre o Stack Overflow, terá que filtrar as respostas / comentários perguntando "por que você não está usando primitivos?". Se você não acredita em mim, basta olhar para as batalhas que as pessoas têm sobre coisas como posicionamento de colchetes, o que nem afeta o código gerado!
Normalmente eu listaria alguns contra-pontos, mas sinceramente não consigo pensar em nenhuma boa razão para não aceitar a convenção aqui!