Objetos inmutables versus colecciones inmutables
Uno de los puntos más finos en el debate sobre los objetos mutables frente a los inmutables es la posibilidad de extender el concepto de inmutabilidad a las colecciones. Un objeto inmutable es un objeto que a menudo representa una única estructura lógica de datos (por ejemplo, una cadena inmutable). Cuando tiene una referencia a un objeto inmutable, el contenido del objeto no cambiará.
Una colección inmutable es una colección que nunca cambia.
Cuando realizo una operación en una colección mutable, entonces cambio la colección en su lugar, y todas las entidades que tienen referencias a la colección verán el cambio.
Cuando realizo una operación en una colección inmutable, se devuelve una referencia a una nueva colección que refleja el cambio. Todas las entidades que tienen referencias a versiones anteriores de la colección no verán el cambio.
Las implementaciones inteligentes no necesariamente necesitan copiar (clonar) toda la colección para proporcionar esa inmutabilidad. El ejemplo más simple es la pila implementada como una lista vinculada individualmente y las operaciones push / pop. Puede reutilizar todos los nodos de la colección anterior en la nueva colección, agregando solo un nodo para la inserción y sin clonar nodos para el pop. La operación push_tail en una lista vinculada individualmente, por otro lado, no es tan simple o eficiente.
Variables / referencias inmutables frente a variables mutables
Algunos lenguajes funcionales toman el concepto de inmutabilidad para objetar referencias, permitiendo solo una asignación de referencia única.
- En Erlang esto es cierto para todas las "variables". Solo puedo asignar objetos a una referencia una vez. Si tuviera que operar en una colección, no podría reasignar la nueva colección a la referencia anterior (nombre de la variable).
- Scala también incorpora esto al lenguaje con todas las referencias declaradas con var o val , vals solo como asignación única y promoviendo un estilo funcional, pero vars permitiendo una estructura de programa más similar a C o Java.
- Se requiere la declaración var / val, mientras que muchos lenguajes tradicionales usan modificadores opcionales como final en java y const en C.
Facilidad de desarrollo frente a rendimiento
Casi siempre la razón para usar un objeto inmutable es promover una programación libre de efectos secundarios y un razonamiento simple sobre el código (especialmente en un entorno altamente concurrente / paralelo). No tiene que preocuparse de que otra entidad cambie los datos subyacentes si el objeto es inmutable.
El principal inconveniente es el rendimiento. Aquí hay una reseña de una prueba simple que hice en Java comparando algunos objetos inmutables frente a mutables en un problema de juguete.
Los problemas de rendimiento son discutibles en muchas aplicaciones, pero no en todas, razón por la cual muchos paquetes numéricos grandes, como la clase Numpy Array en Python, permiten actualizaciones in situ de matrices grandes. Esto sería importante para las áreas de aplicación que utilizan operaciones de matriz y vectores grandes. Estos grandes problemas de datos paralelos y computacionalmente intensivos logran una gran aceleración al operar en el lugar.
string
es inmutable, al menos en .NET, y creo que también en muchos otros lenguajes modernos.