Mutabilidad en Java
Publicado en Java el 25 de February, 2008 por Lek. (14 comentarios)En Java se supone que todos los parámetros de una función se pasan por valor, pero pronto descubres que no es así y si modificas un objeto dentro de una función, queda alterado desde el punto del código que llamó a dicha función. Por poner un ejemplo,
//Esta función modifica el valor de d
public Date getDate (Date d){
//d = new Date(); ERRÓNEO
d.setTime (d.getTime () + 5000);
return d;
}
Esto se debe a una propiedad de los objetos denominada mutabilidad (de mutar, cambiar) y que podemos expresar de la siguiente manera:
- Objetos mutables: Cuando tenemos una referencia a la instancia de un objeto y su contenido puede ser alterado
- Objetos inmutables: Cuando tenemos una referencia a la instancia de un objeto y su contenido no puede ser alterado
Es una práctica común el incluir objetos mutables en una clase Java sin darnos cuenta, como hemos visto en el ejemplo (fechas, streams, arrays, objetos propios…). Puede ser muy útil o también muy molesto según la situación, pues el objeto es asignado directamente y operamos directamente sobre la misma instancia en todas las partes del código. La solución es crear una nueva instancia del objeto, tanto a la hora de asignar como a la hora de retornar los valores.
//Esta función no modifica el valor de d
public Date getDate (Date d){
Date d2 = new Date(d.getTime());
d2.setTime(d2.getTime () + 5000);
return d2;
}
A continuación os pongo un enlace de lectura interesante, Mutable and Immutable Objects.
Vía Bellz, que lo expuso magistralmente en el blog interno de programación.
Actualización 22:14
Gracias a Federico Varela por recordarnos que el ejemplo era más inexacto que Java multiplicando doubles ;) En el primer ejemplo no se modificaba el valor de d al estar ya creando la nueva instancia en la función. Los he corregido para que sean exactamente lo que trataba de expresar en el post.
The Practice Of Programming (