Viniendo de un fondo OOP (Java), estoy aprendiendo Scala por mi cuenta. Si bien puedo ver fácilmente las ventajas de usar objetos inmutables individualmente, me cuesta ver cómo se puede diseñar una aplicación completa como esa. Daré un ejemplo:
Digamos que tengo objetos que representan "materiales" y sus propiedades (estoy diseñando un juego, así que realmente tengo ese problema), como el agua y el hielo. Tendría un "gerente" que posee todas esas instancias de materiales. Una propiedad sería el punto de congelación y fusión, y a qué se congela o derrite el material.
[EDITAR] Todas las instancias materiales son "singleton", algo así como una enumeración de Java.
Quiero "agua" para decir que se congela a "hielo" a 0 ° C, y "hielo" para decir que se derrite a "agua" a 1 ° C. Pero si el agua y el hielo son inmutables, no pueden obtener una referencia el uno al otro como parámetros del constructor, porque uno de ellos debe crearse primero, y ese no podría obtener una referencia al otro que aún no existe como parámetro del constructor. Podría resolver esto dándoles a ambos una referencia al gerente para que puedan consultarlo para encontrar la otra instancia material que necesitan cada vez que se les solicite sus propiedades de congelación / fusión, pero luego obtengo el mismo problema entre el gerente y los materiales, que necesitan una referencia entre sí, pero solo se puede proporcionar en el constructor de uno de ellos, por lo que el administrador o el material no pueden ser inmutables.
¿Simplemente no hay forma de evitar este problema, o necesito usar técnicas de programación "funcionales", o algún otro patrón para resolverlo?
h2omaterial