metodo example concepto bootstrap java wrapper

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.



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.