106 votes

val-mutable versus var-immuable dans Scala

Existe-t-il des directives dans Scala sur l'utilisation de val avec une collection mutable par rapport à l'utilisation de var avec une collection immuable? Ou devriez-vous vraiment viser val avec une collection immuable?

Le fait qu'il existe deux types de collection me donne beaucoup de choix, et souvent je ne sais pas comment faire ce choix.

106voto

Daniel C. Sobral Points 159554

Assez commun en question, celui-ci. Le plus difficile, c'est de trouver les doublons.

Vous devriez vous efforcer pour la transparence référentielle. Ce que cela signifie est que, si j'ai une expression "e", je pourrais faire un val x = e, et remplacez - e avec x. C'est la propriété que la mutabilité pause. Chaque fois que vous avez besoin pour rendre une décision de conception, pour maximiser la transparence référentielle.

En pratique, une méthode locale var est le plus sûr var qui existe, puisqu'il n'échappe pas à la méthode. Si la méthode est courte, même mieux. Si ce n'est pas le cas, essayez de le réduire par l'extraction d'autres méthodes.

D'autre part, une mutable collection a le potentiel d'évasion, même s'il ne le fait pas. Lors de la modification de code, vous pourriez souhaitez ensuite passer à d'autres méthodes, ou de le retourner. C'est le genre de chose qui brise la transparence référentielle.

Sur un objet (un champ), à peu près la même chose, mais avec plus de conséquences désastreuses. De toute façon l'objet de l'état et, par conséquent, la rupture référentielle de la transparence. Mais avoir une mutable collecte signifie que l'objet lui-même pourrait perdre le contrôle de qui de le changer.

17voto

Malte Schwerhoff Points 5713

Si vous travaillez avec immuables collections et vous avez besoin de "modifier", par exemple, ajouter des éléments dans une boucle, alors vous devez utiliser vars parce que vous avez besoin pour stocker la collection quelque part. Si vous ne lisez pas de immuable collections, puis utilisez vals.

En général, assurez-vous que vous ne confondez pas les références et les objets. vals sont immuables références (constante de pointeurs en C). C'est, lorsque vous utilisez val x = new MutableFoo(), vous serez en mesure de changer l'objet qu' x des points, mais vous ne serez pas en mesure de changer d'objet en x des points. À l'opposé détient si vous utilisez var x = new ImmutableFoo(). Ramasser mon premier conseil: si vous n'avez pas besoin de changer d'objet d'un des points de référence, utilisez vals.

10voto

jmazin Points 81

La meilleure façon de répondre à cette question est un exemple. Supposons que nous avons des processus de la simple collecte de numéros pour une raison quelconque. Nous souhaitons journal de ces chiffres, et enverra la collection à un autre processus pour ce faire.

Bien sûr, nous sommes toujours à la collecte des numéros après nous envoyer la collecte de l'enregistreur. Et disons qu'il y a une surcharge dans le processus d'enregistrement que les retards de l'enregistrement réel. J'espère que vous pouvez voir où cela va.

Si nous conservons cette collection dans un mutable val, (mutable parce que nous sommes constamment en ajoutant à cela), cela signifie que le processus de faire de la destruction de regarder le même objet qui est toujours mis à jour par nos processus de collecte. Cette collection peut être mise à jour à tout moment, et alors, quand il est temps de se connecter on ne peut pas réellement être la journalisation de la collection, nous vous avons envoyé.

Si nous utilisons une immuable var, nous envoyer un immuable structure de données de l'enregistreur de données. Lorsque nous ajouter d'autres numéros de notre collection, nous allons remplacer notre var avec un nouveau immuable structure de données. Cela ne signifie pas que la collecte envoyé à l'enregistreur de données est remplacé! C'est encore le référencement de la collection, il a été envoyé. Donc, notre logger en effet, le journal la collection qu'il a reçu.

2voto

Bogdan Nicolau Points 68

Je pense que les exemples dans ce blog va jeter plus de lumière, comme la question de combo à utiliser devient encore plus important dans la simultanéité des scénarios: l'importance de l'immuabilité de la simultanéité. Et pendant que nous y sommes, remarque l'utilisation de synchronisées vs @volatils vs quelque chose comme AtomicReference: trois outils

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X