6

Estoy evaluando a Scala y tengo un problema con sus colecciones inmutables.Cómo hacer que las colecciones inmutables de Scala contengan objetos inmutables

Quiero hacer colecciones inmutables, que son completamente inmutables, a través de todos los objetos contenidos, los objetos a los que hacen referencia, ad infinitum.

¿Hay una manera simple de hacer esto?

El código en http://www.finalcog.com/immutable-containers-scala ilustra lo que estoy tratando de lograr, y una obra desagradable alrededor (ImmutablePoint).

El problema con la solución alternativa es que cada vez que quiero cambiar un objeto tengo que hacer una nueva copia manualmente. Entiendo que el tiempo de ejecución tendrá que implementar copy-on-write, ¿pero esto puede hacerse transparente para el desarrollador?

Supongo que estoy buscando hacer Objetos inmutables, donde los métodos cambian el estado del objeto actual, pero todas las demás referencias 'val' (y todos los contenedores inmutables) al objeto conservan el estado 'anterior'.

+0

Te puede interesar este artículo: http://lamp.epfl.ch/~phaller/capabilities.html –

+0

Excelente material de lectura, gracias. – fadedbee

Respuesta

9

Esto no es posible desde el primer momento con scala a través de una construcción de lenguaje específico a menos que haya seguido el modismo que todos de sus objetos son inmutables, en cuyo caso este comportamiento es gratis.

Con 2.8, los parámetros nombrados han hecho que los "constructores de copia" sean bastante agradables de usar, desde una perspectiva de legibilidad. Pero estás en lo cierto, esto funciona como copiar-escribir. El comportamiento que está pidiendo, donde el objeto "actual" es el único mutado va completamente en contra de la forma en que funciona la JVM, desafortunadamente (para usted)!

En realidad, la frase "el objeto actual" no tiene sentido; realmente quieres decir "la actual referencia"! Todas las demás referencias (fuera del alcance léxico actual) que apuntan al mismo objeto, erm, apuntan al mismo objeto! ¡Solo hay un objeto!

lo tanto, no es sólo posible para este objeto aparezca ser mutable desde la perspectiva del ámbito léxico actual, pero inmutable para otros

+0

Gracias por su respuesta. Sí, me refiero a la referencia actual. Creo que estoy un poco confundido con lo que quiero decir con objeto. Si estoy abstrayendo un sistema de contabilidad, por ejemplo, un objeto que representa una cuenta es un solo objeto. Sin embargo, el objeto puede haber pasado por múltiples estados. Me gustaría que los contenedores inmutables hagan referencia al objeto en el "estado" en el que existía en el momento en que se colocó en el contenedor. En mi solución (utilizando solo objetos inmutables), la cuenta estaría representada por una serie de objetos que comparten un campo account_id común. – fadedbee

+0

En conclusión, parece que tendré que usar objetos inmutables hasta el final. Gracias por tu tiempo. – fadedbee

Cuestiones relacionadas