A prática padrão é seguir as primitivas, a menos que você esteja lidando com genéricos (certifique-se de estar ciente de caixas automáticas e unboxing !).
Existem várias boas razões para seguir a convenção:
1. Você evita erros simples:
Existem alguns casos sutis e não intuitivos, que geralmente envolvem iniciantes. Até mesmo codificadores experientes escorregam e cometem esses erros algumas vezes (espero que isso seja seguido por palavrões quando eles depurarem o código e encontrarem o erro!).
O erro mais comum é usar em a == b
vez de a.equals(b)
. As pessoas estão acostumadas a fazer uso de a == b
primitivas, portanto isso é fácil 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 usar os wrappers Object para primitivas do que apenas usar as primitivas. Você está adicionando o custo da instanciação de objetos, chamadas de métodos etc. às coisas que usa em todo o lugar .
A citação de Knuth "... digamos cerca de 97% do tempo: a otimização prematura é a raiz de todo mal" não se aplica aqui. Ele estava falando sobre otimizações que tornam o código (ou sistema) mais complicado - se você concorda com o ponto 2, essa é uma otimização que torna o código menos complicado!
4. É a convenção:
Se você fizer 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 lá fora usarão primitivos. Sempre que você ler um, terá a sobrecarga cognitiva extra de pensar em como ficaria no estilo com o qual está acostumado.
- Outras pessoas acharão seu código mais difícil de ler. Sempre que você faz perguntas no Stack Overflow, você precisa filtrar as respostas / comentários, perguntando "por que você não está usando primitivas?". Se você não acredita em mim, basta olhar para as batalhas que as pessoas enfrentam, como posicionamento de colchetes, que nem sequer afeta o código gerado!
Normalmente eu listaria alguns contrapontos, mas honestamente não consigo pensar em nenhuma boa razão para não ir à convenção aqui!