Autoboxing: Então eu posso escrever: Integer i = 0; em vez de: i = Integer novo Integer (0);

StackOverflow https://stackoverflow.com/questions/766468

  •  12-09-2019
  •  | 
  •  

Pergunta

Autoboxing parece vir para baixo para o fato de que eu posso escrever:

Integer i = 0; 

em vez de:

Integer i = new Integer(0);

Assim, o compilador pode converter automaticamente um primitivo a um objeto.

É essa a ideia? Por que isso é importante?

Foi útil?

Solução

Você tipo de simplificado-lo um pouco demais.

Autoboxing também entra em jogo quando se usa coleções. Conforme explicado no docs Java da Sun:

Collections só pode conter referências a objetos, então você tem a caixa valores primitivos para a classe wrapper apropriado. ... Quando você tomar o objeto para fora da coleção, você começa a Integer que você colocar em; se você precisar de um int, você deve unbox o Integer usando o método intValue. Tudo isso boxing e unboxing é uma dor, e atravanca seu código. O autoboxing e recurso unboxing automatiza o processo, eliminando a dor e a desordem.

Então, quando você deve usar autoboxing e unboxing? Use-os apenas quando há uma “diferença de impedância” entre tipos de referência e primitivos, por exemplo, quando você tem que colocar valores numéricos em uma coleção. Não é apropriado usar autoboxing e unboxing para computação científica, ou outro código numérico sensível ao desempenho. Um Integer não é um substituto para um int; autoboxing e desfocagem do unboxing a distinção entre tipos primitivos e tipos de referência, mas não eliminá-lo.

Great visão geral de Autoboxing

Outras dicas

BTW

Integer i = 0;

é equivalente a

Integer i = Integer.valueOf(0);

A diferença é que valueOf () não cria um novo objeto para valores entre -128 e 127 (Aparentemente, este será sintonizável se o Java 6u14)

Ela existe para que você possa escrever código como

List<Integer> is = new ArrayList<Integer>();
is.add(1); // auto-boxing
is.add(2);
is.add(3);

int sum = 0;
for (int i : is)  // auto-unboxing
{
    sum += i;
}

Para inteiros individuais você deve por padrão usar o int tipo, não Integer. Integer é principalmente para uso em coleções.

Tenha em atenção que um Long é diferente do mesmo valor como um inteiro (usando equals ()), mas como um tempo que é igual a um int (usando ==).

Essa é a idéia, sim. É ainda mais conveniente para ser capaz de atribuir um Integer para um int, no entanto.

Pode-se argumentar que os endereços autoboxing um sintoma e não uma causa. A verdadeira fonte de confusão é que tipo de sistema de Java é inconsistente: a necessidade de ambos os primitivos e referências de objeto é artificial e estranho. Autoboxing mitiga que um pouco.

Com o meu chapéu cínico em: fazer-se de limitações no Java originais (Quero dizer Oak aqui) spec. Não apenas pela primeira vez.

Faz para código mais legível e mais puro. Especialmente se você está fazendo operações (Como o Java não tem sobrecarga de operador).

Pelo que me lembro de ler Java Efetivo de Joshua Bloch, você deve considerar os primitivos sobre os seus homólogos em caixa. Autoboxing sem levar em conta os seus efeitos secundários podem produzir problemas.

Adicionando ao comentário de Lim, primitivos são armazenados na pilha, e primitivas-wrappers, como objetos, são armazenados na pilha ... Há implicações sutis devido a isso.

A principal vantagem seria a legibilidade, açúcar sintático basicamente. Java já é muito detalhado, a Sun está tentando todos os tipos de formas de tornar a sintaxe mais curta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top