Me encanta el "patrón" inmutable debido a sus puntos fuertes, y en el pasado he encontrado beneficioso diseñar sistemas con tipos de datos inmutables (algunos, la mayoría o incluso todos). A menudo, cuando lo hago, me encuentro escribiendo menos errores y la depuración es mucho más fácil.
Sin embargo, mis compañeros en general evitan ser inmutables. No tienen ninguna experiencia (ni mucho menos), sin embargo, escriben objetos de datos de la manera clásica: miembros privados con un captador y un establecedor para cada miembro. Entonces, por lo general, sus constructores no toman argumentos, o tal vez solo toman algunos argumentos por conveniencia. Muy a menudo, la creación de un objeto se ve así:
Foo a = new Foo();
a.setProperty1("asdf");
a.setProperty2("bcde");
Tal vez lo hacen en todas partes. Tal vez ni siquiera definen un constructor que tome esas dos cadenas, sin importar cuán importantes sean. Y tal vez no cambien el valor de esas cadenas más tarde y nunca lo necesiten. Claramente, si esas cosas son ciertas, el objeto estaría mejor diseñado como inmutable, ¿verdad? (el constructor toma las dos propiedades, no establece en absoluto).
¿Cómo decide si un tipo de objeto debe diseñarse como inmutable? ¿Existe un buen conjunto de criterios para juzgarlo?
Actualmente estoy debatiendo si cambiar algunos tipos de datos en mi propio proyecto a inmutables, pero tendría que justificarlo ante mis pares, y los datos en los tipos podrían cambiar (MUY raramente), momento en el que, por supuesto, puede cambiar de la manera inmutable (cree uno nuevo, copiando las propiedades del objeto antiguo, excepto las que desea cambiar). Pero no estoy seguro de si esto es solo mi amor por los inmutables que se muestran, o si existe una necesidad real / beneficio de ellos.