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 ferait le tour. P>
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? P>
Merci pour toutes les intrants! P> synchronizedlist code> et
non vodiifiablelist code> vient de retourner des vues d'une liste, je ne sais pas si p>
collections.synchronizedlist (collections.unmodifiablelist (this.data)); code> p>
6 Réponses :
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 code>: p>
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.
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. P>
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. P>
+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.
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. p>
Pour résoudre ceci, vous devez utiliser des collections immuables et des éléments immuables. Ensuite, la sécurité du fil se produit. P>
Clojure contient une telle immuable (ou persistante) Collections . P>
Mettre simplement, ajouter ou supprimer de nouveaux éléments renvoie une nouvelle collection, qui en général est em> réutiliser de grandes parties de l'ancienne collection via une utilisation intelligente des structures de données de type Trie-Type. P>
seuls, ce sont une mauvaise aptitude à utiliser en Java droit. P>
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. P>
Disclaimer: Je suis le développeur de Pure4J em> p>
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
copieOf code> h1>
Oui, maintenant intégré à Java 10 et plus tard. P>
-
list.copyof code>
li>
-
set.copyof code>
li>
-
carte.copyof code>
li>
ul>
Chacune d'entre elles renvoie une collection séparée des objets trouvés dans l'original. La collection renvoyée est pas em> une vue sur l'original, comme c'est le cas avec les collections.unmodifiables ... code> Méthodes de classe de services publics. P>
La copie Of code> copie les références (pointeurs), pas les objets. Donc, pas beaucoup de mémoire est impliqué. P>
N'est-ce pas trop coûteux en termes d'utilisation de la mémoire?
@Amirhossain the copieOf code> copie les références (pointeurs), pas les objets. Donc, non, pas beaucoup de mémoire est impliqué.
Java 9+ Immutablecollections sont le fil sûr. Par exemple, 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. P>
blockQuote>
Lire la suite à: Oracle Docs P> list.of, map.of, carte.copyof (Java 10 +) code> ...
Selon Oracle Doc, P>