El equipo de Java ha realizado una gran cantidad de trabajo eliminando las barreras a la programación funcional en Java 8. En particular, los cambios en las Colecciones java.util hacen un gran trabajo de encadenar transformaciones en operaciones de flujo muy rápido. Teniendo en cuenta lo bien que han hecho al agregar funciones y métodos funcionales de primera clase en las colecciones, ¿por qué no han podido proporcionar colecciones inmutables o incluso interfaces de colección inmutables?
Sin cambiar ningún código existente, el equipo de Java podría, en cualquier momento, agregar interfaces inmutables que sean iguales a las mutables, sin los métodos de "conjunto" y hacer que las interfaces existentes se extiendan desde ellos, como esto:
ImmutableIterable
____________/ |
/ |
Iterable ImmutableCollection
| _______/ / \ \___________
| / / \ \
Collection ImmutableList ImmutableSet ImmutableMap ...
\ \ \_________|______________|__________ |
\ \___________|____________ | \ |
\___________ | \ | \ |
List Set Map ...
Claro, operaciones como List.add () y Map.put () actualmente devuelven un valor booleano o anterior para la clave dada para indicar si la operación se realizó correctamente o no. Las colecciones inmutables tendrían que tratar dichos métodos como fábricas y devolver una nueva colección que contenga el elemento agregado, que es incompatible con la firma actual. Pero eso podría solucionarse utilizando un nombre de método diferente como ImmutableList.append () o .addAt () e ImmutableMap.putEntry (). La verbosidad resultante estaría más que compensada por los beneficios de trabajar con colecciones inmutables, y el sistema de tipos evitaría los errores de llamar al método incorrecto. Con el tiempo, los métodos antiguos podrían quedar obsoletos.
Victorias de colecciones inmutables:
- Simplicidad: el razonamiento sobre el código es más simple cuando los datos subyacentes no cambian.
- Documentación: si un método toma una interfaz de colección inmutable, sabes que no va a modificar esa colección. Si un método devuelve una colección inmutable, sabe que no puede modificarlo.
- Concurrencia: las colecciones inmutables se pueden compartir de forma segura en subprocesos.
Como alguien que ha probado idiomas que suponen una inmutabilidad, es muy difícil volver al Salvaje Oeste de la mutación desenfrenada. Las colecciones de Clojure (abstracción de secuencia) ya tienen todo lo que las colecciones de Java 8 proporcionan, además de inmutabilidad (aunque tal vez usando memoria extra y tiempo debido a listas vinculadas sincronizadas en lugar de secuencias). Scala tiene colecciones mutables e inmutables con un conjunto completo de operaciones, y aunque esas operaciones son impacientes, llamar a .iterator ofrece una visión perezosa (y existen otras formas de evaluarlas perezosamente). No veo cómo Java puede seguir compitiendo sin colecciones inmutables.
¿Puede alguien indicarme la historia o discusión sobre esto? Seguramente es público en alguna parte.