Long, long ou tanto faz?

OLa pessoal,

jah trabalhei em alguns projetos e jah vi modelos feitos de duas formas:

  1. São usados atributos como tipos primitivos para armazenar números. Por exemplo:
public class Casa {
  private long tamanho;
}
  1. São usados atributos como objetos, independente do que seja. Por exemplo:
public class Casa {
  private Long tamanho;
}

As duas maneiras funcionam e acredito que estejam corretas. Mas existe uma recomendada? Que seja uma melhor prática? Eu acredito que a segunda é a maneira mais OO possível, mas existe algum problema em usar a primeira?

Espero que tenham entendido meu questionamento. Não é nada de muito útil, é só uma dúvida sobre qual é o melhor approach para um projeto.

A classe Long é conhecida como wrapper de tipo primitivo.

Ela é uma classe que representa o tipo primitivo long. A partir do Java 5, é possível usa-la diretamente, como se ela fosse um long. Mas antes do Java 5, isso não era possível.

Ela foi criada pois classes como os Lists e Maps exigem objetos. Como um long ou um int não é um objeto, é necessário usar essa classe wrapper no lugar do tipo primitivo em si.

Ela é muitíssimo mais lenta do que o long. Quando possível, prefira o tipo primitivo.

[quote=ViniGodoy]A classe Long é conhecida como wrapper de tipo primitivo.

Ela é uma classe que representa o tipo primitivo long. A partir do Java 5, é possível usa-la diretamente, como se ela fosse um long. Mas antes do Java 5, isso não era possível.

Ela foi criada pois classes como os Lists e Maps exigem objetos. Como um long ou um int não é um objeto, é necessário usar essa classe wrapper no lugar do tipo primitivo em si.

Ela é muitíssimo mais lenta do que o long. Quando possível, prefira o tipo primitivo.[/quote]

Essa lentidão é ocasionada pelas conversões de primitivo para Objeto e Objeto para primitivo. No java 5 voce tem Boxing e Unboxing que efetua esssa conversão automaticamente.

Um abraço!

Obrigado pelas respostas.

Na verdade, a minha dúvida é em relação ao que é recomendado usar em um projeto. Eu sei que o Long é mais lento que o o seu respectivo tipo primitivo, mas é que eu jah ouvi arquitetos dizendo que todos os atributos(do tipo long, é claro) deveriam usar a classe Wrapper em um projeto OO, e eu queria saber se essa é realmente uma recomendação(boa prática), ou se não tem nada haver, pode usar long.

Olá,

Prefira sempre utilizar as classes Wrapper (Long, no caso), pois além dos motivos mencionados, é a única maneira de se conseguir representar NULL. Algo que é imposssível utilizando tipos primitivos.

Adriano Anderson.

Acredito que isso irá depender da versao que vc estive usando, já li alguns artigos dizendo que o melhor é sempre usar uma classe wrapper.
at.

[quote=adrianoanderson]Olá,

Prefira sempre utilizar as classes Wrapper (Long, no caso), pois além dos motivos mencionados, é a única maneira de se conseguir representar NULL. Algo que é imposssível utilizando tipos primitivos.

Adriano Anderson.[/quote]

Isso também não é verdade. Você pode usar um outro atributo para representar o nulo (um boolean, por exemplo). Ou, se sua variável for somente de números positivos, você pode usar um valor negativo para representar um nulo. Você ainda pode escolher um valor muito improvável, como o menor valor do Long para representar o nulo.

“A única maneira” é algo difícil de se afirmar em informática. Talvez seja uma maneira prática (já que o wrapper pode mesmo valer NULL). E mais explícita. Mas certamente não é a única e, dependendo da aplicação, pode também não ser a mais recomendada.

Artigos que recomendam só os wrappers? Bem, acho isso um pouco exagerado. A menos que a Sun faça alguma melhoras agressivas de performance para as próximas versões do Java (eu realmente gostaria disso. Aí, se ficar bem feito, poderiam até extinguir os tipos primitivos).

[quote=adrianoanderson]Olá,

Prefira sempre utilizar as classes Wrapper (Long, no caso), pois além dos motivos mencionados, é a única maneira de se conseguir representar NULL. Algo que é imposssível utilizando tipos primitivos.

Adriano Anderson.[/quote]

Só não esqueça de avaliar se o limite de memória e/ou tempo de resposta do sistema são coisas fundamentais em seu projeto. Se forem, é melhor usar o primitivo long.