Pergunta

Já ouvi de tipos a ser referido como "box" em algumas línguas.

Em Java, eu ouvi falar de "autoboxing". O que é isso? É ter classes de mensagens publicitárias para um tipo? Como é que a minha mudança de código se eu estou trabalhando com tipos de caixas ou desembalados?

Foi útil?

Solução

Alguns tipos de dados são considerados "primitivo", ou seja, eles não são tratados como um objeto e não têm as propriedades de um objeto.

Na maioria das plataformas, inteiros e personagens são exemplos de tipos que são primitivos, mas pode ser em caixa.

meios de boxe envolvendo-os em um objeto para que eles tenham o comportamento de um objeto.

O significado e comportamento exato depende do idioma que você está usando. Algumas linguagens (como Smalltalk ... pelo menos volta waaay quando eu estava fazendo isso ...) não permitem quaisquer tipos primitivos e considerar tudo para ser um objeto, mas não há uma penalidade de desempenho associado com isso porque, no final do dia, as necessidades de processadores para trabalhar com números brutos e memória bruta para fazer trabalho útil. Se você quer adicionar dois inteiros que foram embalados, por exemplo, nos bastidores eles estão "fora da caixa" para tipos primitivos, são adicionados os números, e eles são, então, encaixotado volta em um novo inteiro.

Outras dicas

Mais informações específicas para Java:

Autoboxing permite java para converter automaticamente coisas como boolean e int para suas versões de objetos Boolean e Integer automaticamente na maioria dos casos. Ele também permite que o contrário aconteça.

Por exemplo:

int a = 3; // no boxing is happening
Integer b = 3;  // newer versions of java automatically convert the int 3 to Integer 3
int c = b;  // these same versions also automatically convert Integer 3 to int 3

As versões mais antigas do Java que não têm autoboxing exigirá este código para fazer a mesma coisa:

int a = 3;  // works the same
Integer b = new Integer(3);  //must set up a Integer object manually
int c = b.intValue(); //must change Integer object to a primitive

No entanto, existem algumas situações em que você ainda tem que fazer as coisas manualmente. Por exemplo, imagine que você tem uma classe com dois métodos assim:

assertEquals(int a, int b);
assertEquals(Object a, Object b)

Agora, se você tentar fazer isso:

Integer a = 3;
int b = 3;
assertEquals(a, b);  // this will not compile

A razão isso não funcionar é porque não consigo descobrir se deve unbox a a um int ou caixa b a um Integer. Por isso, é ambígua que assinatura do método deve ser chamado. Para corrigir isso, você pode fazer um destes:

assertEquals((int) a, b);
assertEquals(a, (Integer) b);

Sim, meios de boxe levando um tipo de valor e envolvê-la em um tipo de referência. Desde java introduzido autoboxing você pode fazer:

void foo(Object bar) {}
//...
    foo(1);

E java vai desligar automaticamente o int 1 em um número inteiro. Em versões anteriores, você teria que fazer:

foo(new Integer(1));

Autoboxing é mais útil em java ao trabalhar com os genéricos, desde que você não pode usar primitivas com os genéricos, de modo a armazenar inteiros em uma lista, você teria que fazer uma List<Integer> e colocar os ints na lista em caixa.

Um encaixotado meios tipo que os valores são atribuídas em um bloco na pilha e referenciados por meio de um ponteiro. Isso é bom para a uniformidade na aplicação do tempo de execução (que torna mais fácil ter funções genéricas, etc.), ao custo de um engano adicional.

Geralmente, quando você trabalha com coleções, você está lidando com matrizes de objetos. Em linguagens como Java, há uma diferença entre um primitivo e um objeto. Quando um primitivo é "encaixotado", que é essencialmente apenas um wrapper em torno de um primitivo por isso joga bonito com o resto da estrutura que está esperando um objeto.

Autoboxing é apenas o ato de colocar um primitivo em um objeto ou puxar um fora primitivo de um objeto transparente, assim você não precisa se preocupar com a etapa extra de fazê-lo sozinho.

meios encaixotadas que tomaram um tipo de valor regular e criou um objeto em torno dele. Mais ou menos como colocá-lo em uma caixa. Isto é geralmente para ser evitada, por causa da sobrecarga de construção do objecto.

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