Il y a quelques cas où vous préférez utiliser immuable cartes, listes, ensembles ou d'autres types de collections.
Premier et sans doute le plus important de cas d'utilisation est à chaque fois que vous revenez à la suite d'une requête ou d'un calcul qui retourne un ensemble (ou une liste ou sur la carte) de résultats, vous devriez préférer utiliser immuable des structures de données.
Dans ce cas, je préfère de beaucoup le retour immuable versions de ces comme cela reflète les faits de l'immuabilité d'un jeu de résultats d'un calcul beaucoup plus clairement, peu importe ce que vous faites avec les données plus tard, l'ensemble des résultats que vous avez reçus de votre requête ne devrait pas changer.
Deuxième commune de cas d'utilisation, c'est quand vous avez besoin de fournir un argument en tant que contribution à une méthode ou d'un service. Sauf si vous attendons à l'entrée de la collection d'être modifiées par le service ou méthode (qui est généralement une très mauvaise idée de conception), en passant dans une immuable de la collection au lieu de la mutable pourrait bien être l'raisonnable et sûre de choix dans de nombreux cas.
Je pense à elle comme "passage par valeur" de la convention.
Plus généralement - il est d'une pratique raisonnable d'utiliser un immuable structures de données lorsque les données croix de module ou de limites de service. Cela le rend beaucoup plus facile de raisonner sur les différences entre (immuable) d'entrée/sortie et mutable état interne.
Comme très bénéfique, cela aurait pour effet de l'accroissement de la sécurité et de la sécurité des threads de vos modules/services et assure le nettoyeur de la séparation des préoccupations.
Une autre bonne raison d'utiliser Collections.empty*()
méthodes est leur manque notable de verbosité désirée. En pré-Java7 époque, si vous aviez une collection générique, vous avez eu à saupoudrer de type générique annotations de tous sur la place.
Il suffit de comparer ces deux déclarations:
Map<Foo, Comparable<? extends Bar>> fooBarMap = new HashMap<Foo, Comparable<? extends Bar>>();
contre:
Map<Foo, Comparable<? extends Bar>> fooBarMap = Collections.emptyMap();
Cette dernière a clairement gagne haut la main sur la lisibilité de deux manières:
- Dans la première déclaration, l'ensemble de l'instanciation d'une carte vide est enterré dans le bruit de type générique déclarations, faisant essentiellement trivial déclaration beaucoup plus énigmatique qu'il doit être.
- Outre l'absence notable de type générique annotation sur le côté droit, la deuxième version stipule clairement que la carte est initialisée à une carte vide.
En outre, sachant que cette méthode retourne un immuable de la carte, il est maintenant plus facile pour moi de trouver où
fooBarMap
est attribué à un autre non vide juste valeur par la recherche d' /fooBarMap =/
.