Quando se usam estruturas de dados, é interessante armazenar objetos genéricos, da classe Object, dentro delas para que seus elementos fiquem independentes dos aplicativos que as usam. Dessa forma, uma estrutura pode ser usada por qualquer aplicativo sem nenhuma modificação. Em muitos casos, o polimorfismo permite o tratamento genérico de um objeto deixando para a máquina virtual a descoberta de sua classe específica.
No entanto, é freqüente a necessidade de manter números, caracteres, ou valores lógicos nessas estruturas, mas a linguagem Java define esses tipos como primitivos, ou seja, não são objetos. Para resolver este problema, há uma classe invólucro (wrapper, em inglês) para cada tipo primitivo. Essas classes, Byte, Short, Integer, Long, Character, Float, Double, Boolean, encapsulam os valores primitivos correspondentes e permitem armazená-los em estruturas genéricas.
O preço que se pagava ao resolver este problema era a exigência de muitas conversões explícitas feitas pelo programador porque os operadores associados aos tipos primitivos só podem ser aplicados a esses tipos primitivos. Lembre-se que em Java não há sobrecarga de operadores aritméticos ou lógicos. O código é tedioso na escrita e confuso na leitura.
O autoboxing endereça justamente este problema. Além de permitir o armazenamento de tipos primitivos, como no passado, esta novidade evita as conversões explícitas antes exigidas dos programadores. Em outras palavras, as conversões são feitas implicitamente pelo compilador.
Para ilustrar o que dissemos, o exemplo abaixo mostra dois métodos, objeto e primitivo, que recebem, respectivamente, um parâmetro do tipo objeto e um do tipo primitivo. As chamadas destes métodos, feitas no método main, passam argumentos primitivos inteiros e objetos do tipo inteiro para cada um dos métodos. O exemplo também mostra o uso direto de objetos em operações aritméticas. As conversões, que antes tinham que ser feitas explicitamente pelo programador, agora são implicitamente feitas pelo compilador. Exemplo:
public class AutoBoxing {
public static void main(String[] args) {
objeto(8); // primitivo em objeto
objeto(new Integer(8)); // objeto em objeto
primitivo(9); // primitivo em primitivo
primitivo(new Integer(9)); // objeto em primitivo
System.out.println("Operação aritmética: " +
(new Integer(20) + new Integer(30)));
Integer a = new Integer(5);
System.out.println(++a);
}
public static void objeto(Integer x) {
System.out.println("Parâmetro objeto com valor: " + x);
System.out.println("Operação aritmética: " + (2 * x + 2));
}
public static void primitivo(int x) {
System.out.println("Parâmetro primitivo com valor: " + x);
}
}
Resumindo, autoboxing é a conversão implícita feita entre os tipos primitivos e seus correspondentes invólucros. Este açúcar introduzido na linguagem evita as conversões explícitas, tediosas e confusas, quando se usam objetos genéricos dentro de coleções.
Nenhum comentário:
Postar um comentário