Autoboxing


Antes do Java 5, para incrementar um valor de um objeto wrapper era necessário extrair esse valor para uma variável primitiva, incrementar o valor e instanciar novamente o objeto com o novo valor, pois classes wrapper são imutáveis. Hoje, com o recurso Autoboxing, o compilador faz isso internamente, ou seja, é possível incrementar diretamente o objeto wrapper.

public class Java4_Java5 {
      public static void main(String[] args) {
            /* no Java 4 não é possível incrementar
             * objetos wrapper; um modo de burlar
             * isso é a seguinte forma: */
            Integer y = new Integer(1);
            int x = y.intValue();
            x++;
            y = new Integer(x);
            System.out.println(y); // imprime 2
           
            /* no Java 5 existe um recurso chamado
             * autoboxing que faz isso
             * automaticamente, ou seja, incrementa
             * objetos wrapper */
            Integer a = new Integer(2);
            a++;
            System.out.println(a); //imprime 3
      }    
}

Obs: quando o compilador utiliza o autoboxing, na verdade ele não incrementa um objeto wrapper, mas sim reatribui um novo valor já incrementado para aquele objeto; ou seja, sempre se tratará de uma nova referência.

Boxing, == e equals()

A intenção do método equals() é determinar se duas instâncias de uma dada classe são equivalentes; para todas as classes wrapper, dois objetos são “equals” se eles são do mesmo tipo e possuem o mesmo valor; ou seja, se os dois objetos wrapper tiverem o mesmo valor primitivo, o equals() os considerará equivalentes e retornará true.
Duas instâncias de uma classe wrapper sempre serão “==” quando seus valores primitivos forem o mesmo e forem menores que 127, se forem maiores serão diferentes, mesmo se tratando de valores iguais.

public class Equals {  
      public static void main(String[] args) {
            Integer int1 = 200;
            Integer int2 = 200;
            /* não são iguais porque, apesar de
             * possuirem o mesmo valor, são menores
             * que 127 */
            if(int1 == int2)
                  System.out.println("==");
            else
                  System.out.println("!=");
            /*são equals porque possuem o mesmo valor*/
            if(int1.equals(int2))
                  System.out.println("equals");
            else
                  System.out.println("não equals");
      }
}

Obs.: classes wrapper podem ser null, portanto, antes de utilizar operações de primitivos com esses objetos deve-se verificar se este está instanciado.



Fonte: SCJP Sun Certified Programmer for Java 6 Study Guide

0 comentários:

Postar um comentário