example - ¿Son las clases de envoltura de Java realmente inmutables?
wrapper int (5)
El compilador autoboxes los valores primitivos, esto significa que
Integer value = 6;
será compilado como
Integer value = Integer.valueOf(6);
Integer.valueOf devolverá una instancia de Integer con el valor dado. En su caso, ahora haré referencia al Integer (6) en lugar del Integer (5), el objeto Integer (5) no cambiará.
Para ver esto puedes hacer lo siguiente.
Integer i = new Integer(5);//assign new integer to i
Integer b = i;//b refences same integer as i
i = 6;//modify i
System.out.println(i +"!="+b);
Esto imprimirá 6!=5
, si la instancia de entero se hubiera modificado, imprimiría 6!=6
lugar.
Aclarar esto solo tiene la intención de mostrar cómo una asignación a Integer solo modifica la referencia y no altera la instancia de Integer. Como el usuario @KNU señala, no prueba ni muestra la inmutabilidad de Integer, por lo que puedo decir, la inmutabilidad solo se da indirectamente por la falta de métodos de modificación en su API y el requisito de que las instancias devueltas por Integer.valueOf tengan que ser almacenado en caché para un cierto rango.
Se supone que las clases de Java Wrapper son inmutables. Esto significa que una vez que se está creando un objeto, por ejemplo,
Integer i = new Integer(5);
su valor no puede ser cambiado Sin embargo, haciendo
i = 6;
es perfectamente valido
Entonces, ¿qué significa la inmutabilidad en este contexto? ¿Tiene esto que ver con el auto-boxing / unboxing? Si es así, ¿hay alguna manera de evitar que el compilador lo haga?
Gracias
Inmutable significa que el estado del objeto no se puede cambiar. En su caso, no ha cambiado el objeto new Integer(5)
, pero ha cambiado la referencia i
para que apunte a otro objeto. Espero que quede claro :)
La razón por la que i = 6
funciona es que el auto-boxeo está interceptando y convirtiéndolo en i = new Integer(6)
. Por lo tanto, como dijo @Peter, ahora estás apuntando a un nuevo objeto.
Todas las clases de envoltura en java son inmutables. No podemos cambiar el valor de un objeto de clase contenedor una vez creado. ¿Por qué las clases de cadenas y envoltorios son inmutables en java? para más información.
i
es una referencia. Su código cambia la referencia i
para que apunte a un Integer
diferente, igualmente inmutable.
final Integer i = Integer.valueOf(5);
podría ser más útil.