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