Inmutabilidad
La propiedad de un valor o variable que no se puede cambiar una vez creado.
Una variable inmutable recibe su valor una vez y ya no cambia: const en JavaScript, val en Kotlin, final en Java o cualquier let sin mut en Rust.
Si un dato no puede cambiar, no hay que buscar qué parte del programa lo modificó, y compartirlo entre hilos es seguro. Por eso muchos lenguajes recomiendan usar valores inmutables por defecto.
Un ejemplo
const IVA = 21; evita que, por error, alguna parte del programa cambie el porcentaje.
Por qué importa
Un dato inmutable no cambia una vez creado: para «modificarlo» se crea uno nuevo. Esto simplifica mucho el razonamiento sobre un programa, porque si nadie puede alterar un valor, tampoco puede aparecer un cambio inesperado desde otra parte del código. Es especialmente valioso en programación concurrente, donde varias tareas leyendo un dato que nadie modifica no pueden pisarse entre sí.
Lo encuentras en muchos sitios: las cadenas de texto en Java, Python y C# son inmutables; const en JavaScript, final en Java y let en Rust (que por defecto no permite reasignar) fomentan valores que no cambian; y librerías como Redux en el frontend se basan en actualizar el estado creando copias nuevas. Si no lo entiendes, te sorprenderán errores al intentar modificar una cadena o una tupla.
Confusiones frecuentes
Es frecuente confundir una variable constante con un valor inmutable. En JavaScript, const lista = [1, 2] impide reasignar lista, pero lista.push(3) sigue funcionando porque el array es mutable; lo que no cambia es la referencia. Otro error típico es modificar un objeto recibido como argumento esperando que no afecte al original: si el objeto es mutable, el cambio se ve fuera de la función. Para evitarlo, se copia el objeto o se usan estructuras inmutables.
Preguntas frecuentes
¿Por qué no puedo cambiar una letra de una cadena en Python?
Porque las cadenas son inmutables. No puedes hacer texto[0] = "A"; debes construir una nueva, por ejemplo texto = "A" + texto[1:].
¿Crear copias todo el rato no es lento?
Puede serlo si se hace sin cuidado, pero muchas estructuras inmutables comparten partes entre versiones para evitar copiar todo. En la práctica, la claridad suele compensar el coste.
Fuentes consultadas
- Object.freeze() (MDN Web Docs)