L’équipe Java a déployé des efforts considérables pour supprimer les obstacles à la programmation fonctionnelle dans Java 8. En particulier, les modifications apportées aux collections java.util permettent d’enchaîner les transformations en opérations très rapides. Compte tenu de la qualité de leur travail d’ajout de fonctions de première classe et de méthodes fonctionnelles sur les collections, pourquoi ont-ils complètement échoué à fournir des collections immuables, voire des interfaces de collection immuables?
Sans modifier aucun code existant, l'équipe Java pourrait à tout moment ajouter des interfaces immuables identiques à celles qui sont mutables, moins les méthodes "set", et en faire s'étendre les interfaces existantes, comme suit:
ImmutableIterable
____________/ |
/ |
Iterable ImmutableCollection
| _______/ / \ \___________
| / / \ \
Collection ImmutableList ImmutableSet ImmutableMap ...
\ \ \_________|______________|__________ |
\ \___________|____________ | \ |
\___________ | \ | \ |
List Set Map ...
Bien sûr, des opérations comme List.add () et Map.put () renvoient actuellement une valeur booléenne ou précédente pour la clé donnée pour indiquer si l'opération a réussi ou échoué. Les collections immuables doivent traiter ces méthodes comme des usines et renvoyer une nouvelle collection contenant l'élément ajouté - ce qui est incompatible avec la signature actuelle. Mais cela pourrait être résolu en utilisant un nom de méthode différent comme ImmutableList.append () ou .addAt () et ImmutableMap.putEntry (). Les avantages de travailler avec des collections immuables l'emporteraient sur la verbosité qui en résulterait et le système de types éviterait les erreurs d'appeler la mauvaise méthode. Avec le temps, les anciennes méthodes pourraient être obsolètes.
Victoires des collections immuables:
- Simplicité - le raisonnement sur le code est plus simple lorsque les données sous-jacentes ne changent pas.
- Documentation - Si une méthode prend une interface de collection immuable, vous savez qu'elle ne modifiera pas cette collection. Si une méthode retourne une collection immuable, vous savez que vous ne pouvez pas la modifier.
- Concurrence - les collections immuables peuvent être partagées en toute sécurité entre les threads.
En tant que personne ayant goûté à des langues supposées immuables, il est très difficile de retourner dans le Far West avec une mutation rampante. Les collections de Clojure (séquence abstraite) ont déjà tout ce que les collections de Java 8 fournissent, ainsi que leur immuabilité (bien que l'utilisation de mémoire et de temps supplémentaires soient dus à des listes chaînées synchronisées plutôt qu'à des flux). Scala possède à la fois des collections modifiables et immuables avec un ensemble complet d'opérations. Bien que ces opérations soient ardentes, appeler .iterator vous donne une vue paresseuse (et il existe d'autres moyens de les évaluer paresseusement). Je ne vois pas comment Java peut continuer à rivaliser sans collections immuables.
Quelqu'un peut-il m'indiquer l'histoire ou la discussion à ce sujet? C'est sûrement public quelque part.
const
collections
Collections.unmodifiable*()
. mais ne les traitez pas comme immuables quand ils ne le sont pas
ImmutableList
dans ce diagramme, les gens peuvent-ils passer dans un mutable List
? Non, c'est une très mauvaise violation de LSP.