8
votes

Comment retourner une collection de sécurité / immuable à Java?

Dans le projet, je suis codant, je dois retourner une vue sûre et immuable d'une fonction. Cependant, je ne suis pas sûr de cela. Étant donné que synchronizedlist et non vodiifiablelist vient de retourner des vues d'une liste, je ne sais pas si

collections.synchronizedlist (collections.unmodifiablelist (this.data));

ferait le tour.

Quelqu'un pourrait-il me dire si cela est correct et si ce n'est pas le cas, existe-t-il des situations que cela serait probablement échouer?

Merci pour toutes les intrants!


0 commentaires

6 Réponses :


5
votes

Je pense que la non modifiable est suffisante. Vous ne pouvez pas y écrire, ce qui est ce qui cause des problèmes d'accès multi-thread. C'est en lecture seule, l'étape supplémentaire de la synchronisation me semble inutile.

meilleur pour vérifier le code source quand il y a des questions comme celle-ci. On dirait qu'il renvoie un non vodiifiablelist : xxx


3 commentaires

Mais n'est-il pas non modifiable, il suffit de renvoyer une vue que le fil qui obtient cette vue ne peut pas modifier la liste à travers elle? Ou peut-être que je l'interpréte mal?


Le consommateur ne serait pas en mesure de modifier la liste, mais la liste d'origine pourrait être modifiée si elle est conservée.


C'est correct, tant que personne ne modifie la collection "originale" (non emballée). C'est une bonne idée de limiter cela aux collections que vous avez construites vous-même. Perdre votre propre référence à l'original une fois que vous l'enveloppez avec une bonne idée est une bonne idée. Safer toujours est d'utiliser les collections immuables mentionnées dans la réponse de Ray, car il n'y a pas de collection mutable pour fuir accidentellement.



13
votes

Je trouve que cela soit un véritable espace dans la JDK. Heureusement, une équipe sur Google, dirigée par Java Collections Designer Joshua Bloch , avez créé un Library qui inclut des collections vraiment immuables.

Immutablelist en particulier est la mise en œuvre que vous 'Re cherche. ici est un croquis rapide de certaines des caractéristiques des immutableCollections de Guava.


5 commentaires

+1 Ray, pouvez-vous relier ou élaborer par ce que vous voulez dire un véritable écart dans JDK, est-ce jusqu'à JDK 6 et 7?


Je ne connais pas un tel ajout dans JDK 7; Je ne connais pas d'une liste vraiment immuable dans JDK 6.


Vous pouvez obtenir le même résultat tout en effectuant une copie de la liste d'origine et en retournant une vue non modifiable de la copie. Donc, il ne fait que sauver une ligne de code - mais si l'on utilise déjà Guava, pourquoi écrire une ligne de code supplémentaire?


@Voo, oui et non. Vous avez raison que la vue non modifiable d'une copie rejetée serait vraiment immuable. Mais, alors supposez que vous soyez le consommateur de cette liste. Vous ne savez pas si le producteur a conservé la liste modifiable ou non. Donc, vous devez faire une copie défensive vous-même, qui a une surcharge qui y est associée. Si vous utilisiez une liste, cela pourrait garantir qu'il ne pouvait être modifié par aucun moyen, le programmeur pourrait être confiant que cette étape pourrait être évitée. En fait, si vous essayez de faire une copie défensive de l'immutableliste de Guava, elle vous rendra l'instance originale.


Il existe une collection immuable à la protection de la guava. Je ne suis toujours pas sûr. La question ne concerne pas les changements concurrents, mais sur les effets de simultanation de la mémoire de la mémoire Java.



0
votes

Ces vues ne vous retourneront pas vraiment des collections de sécurité. Il y a toujours la possibilité que quelqu'un modifie soit la collection de support, soit les éléments de la collection.

Pour résoudre ceci, vous devez utiliser des collections immuables et des éléments immuables. Ensuite, la sécurité du fil se produit.

Clojure contient une telle immuable (ou persistante) Collections .

Mettre simplement, ajouter ou supprimer de nouveaux éléments renvoie une nouvelle collection, qui en général est réutiliser de grandes parties de l'ancienne collection via une utilisation intelligente des structures de données de type Trie-Type.

seuls, ce sont une mauvaise aptitude à utiliser en Java droit.

pure4j est une tentative de port de ceux-ci (et le style basé immuable / de valeur préconisé par le clojure) à la langue java. Ce pourrait être ce que vous êtes après.

Disclaimer: Je suis le développeur de Pure4J


0 commentaires

5
votes
Collections.unmodifiableList(this.data) 
Statement above will do, as it will return a view. Any modification attempts on this view will result of UnsupportedOperationException being thrown. Below are excerpt of Collections#unmodifiableList documentation.
Returns an unmodifiable view of the specified list. This method allows modules to provide users with "read-only" access to internal lists. Query operations on the returned list "read through" to the specified list, and attempts to modify the returned list, whether direct or via its iterator, result in an UnsupportedOperationException.
......
java 8 java.util.Collections javadoc

0 commentaires

3
votes

copieOf

Oui, maintenant intégré à Java 10 et plus tard.

  • list.copyof
  • set.copyof
  • carte.copyof

    Chacune d'entre elles renvoie une collection séparée des objets trouvés dans l'original. La collection renvoyée est pas une vue sur l'original, comme c'est le cas avec les collections.unmodifiables ... Méthodes de classe de services publics.

    La copie Of copie les références (pointeurs), pas les objets. Donc, pas beaucoup de mémoire est impliqué.


2 commentaires

N'est-ce pas trop coûteux en termes d'utilisation de la mémoire?


@Amirhossain the copieOf copie les références (pointeurs), pas les objets. Donc, non, pas beaucoup de mémoire est impliqué.



1
votes

Java 9+ Immutablecollections sont le fil sûr. Par exemple, list.of, map.of, carte.copyof (Java 10 +) ... Selon Oracle Doc,

Un avantage d'une collection immuable est qu'il est automatiquement en sécurité. Après avoir créé une collection, vous pouvez la remettre à plusieurs threads, et ils verront toutes une vue cohérente.

Lire la suite à: Oracle Docs


0 commentaires