leí lo siguiente en un articledeshacer/rehacer con objetos inmutables
Los objetos inmutables son particularmente práctico de aplicación de determinadas expresiones comunes, tales como deshacer/rehacer y Abortables transacciones. Deshacer deshacer por ejemplo. Una técnica común para implementar deshacer es mantener una pila de objetos que de alguna manera sabe cómo ejecutar cada comando en reversa (el llamado "Patrón Comando"). Sin embargo, averiguar cómo ejecutar un comando en reversa puede ser complicado. Una técnica más simple es mantener una pila de objetos inmutables que representa el estado del sistema entre comandos sucesivos. Luego, para deshace un comando, simplemente revierte al estado anterior del sistema (y probablemente guarde el estado actual en la pila de rehacer).
Sin embargo, el artículo no muestra un buen ejemplo práctico de cómo los objetos inmutables podrían utilizarse para implementar operaciones de "deshacer". Por ejemplo ... eliminar 10 correos electrónicos de una bandeja de entrada de Gmail. Una vez que haces eso, tiene una opción de deshacer. ¿Cómo ayudaría un objeto inmutable en este sentido?
"Las bandejas de entrada de Gmail son demasiado grandes para utilizar esta técnica". Ish. Si los mensajes reales son objetos separados, y los dos objetos diferentes de la bandeja de entrada se refieren a los mismos mensajes, entonces una bandeja de entrada es solo una lista y probablemente pueda hacerlo de esta manera. La otra gran cosa acerca de los objetos inmutables es que los objetos pueden compartir de manera segura recursos como este.Con los objetos mutables, es posible que tenga que preocuparse por los cambios en uno que aparezca incorrectamente en el otro. –
Ese es un punto excelente. Observo que para una cuenta de GMail, el objeto inmutable apropiado sería la lista de etiquetas y las listas asociadas de objetos de correo electrónico para cada etiqueta; esto es mucho más pequeño que todo el archivo, pero mucho más grande que solo la lista de mensajes de la bandeja de entrada. – jprete