J'ai récemment examiné du code sur un projet open source et j'ai trouvé de nombreuses occurrences de ce type de code: existe-t-il un bénéfice réel pour faire une copie de la variable d'instance ? p> p>
6 Réponses :
Le seul avantage que je vois consiste à avoir une "version réadonn" de la variable juste pour cette méthode p>
Non, sauf si vous ne souhaitez pas modifier la valeur de Somenumumber et que vous avez l'intention de mettre à jour SomenumberCopy. Comme si vous alliez boucler le nombre de fois et allait décrémenter somenumbercopy à zéro pour garder une trace du compte. p>
Je suppose que la copie de la variable comme celle-ci pourrait vous protéger de certaines fonctions extérieures altérant somenumber et la modifier sans vos connaissances tout en effectuant une opération. Je pourrais potentiellement voir cela si la classe était censée être utilisée dans une application multi-threadée. Peut-être que je ne voudrais pas y aller, mais cela aurait pu être l'intention de l'auteur. P>
est le Si non alors non, il n'y a pas d'avantage. P> // ... faites-le travailler avec SomenumberCopy CODE> faire quelque chose avec SomenumberCopy? Est-ce que cela change la valeur? Est-il passé à une méthode qui pourrait changer la valeur? P>
Peut-être que cela fait partie du programme multi-threadé. Bien que ce code ne soit pas le fil-coffre-fort, il garantit qu'une variable une fois que la variable de copie est attribuée, elle n'est pas modifiée par un autre threads, et tous les codes de fonction suivant une manière constante.
code similaire avec des événements devient critique dans l'environnement multi-fileté: P>
MyEvent e = this.myEvent; if ( e != null ) { e(); }
Je n'ai même pas pensé à la multi-fileté lorsque je cherchais le code, merci donc de votre réponse. Après avoir regardé en arrière, il s'avère que l'utilisation réelle est que la variable d'instance est déjà réadaptée et définie par le constructeur, et la valeur n'est pas modifiée. Il me semble maintenant que cela peut avoir été fait pour changer le nom de la variable afin que le code se lit plus facile.
Vous avez laissé de côté quelques détails importants. alors il est important de faire une copie. P> p>
Si vous avez plusieurs threads accédant à un somenumber et ce scénario:
Il pourrait être utile si this.somenumumber code> peut être modifié par un autre thread, mais pour la durée de cette méthode, il est essentiel que le
somenumbercopy code> ne puisse pas être modifié (il Peut être hors de synchronisation avec
somenumber code>) alors cela pourrait être viable, sinon je ne vois pas une raison pour cela. P>
Un avantage est la sécurité du fil libre
Ce n'est pas aussi typique de voir ce modèle utilisé pour la copie d'un champ entier, mais je vois et utilisez-le souvent lors de la référencement des champs pouvant être définis sur NULL sur un autre fil. Ce n'est qu'une petite partie d'une conception de fil-coffre-fort, mais cela est important pour empêcher les conditions de course difficiles à trouver.
@Dan: Ou, pour créer des conditions de course difficiles à trouver. Lorsque vous faites une copie, vous venez de vous retrouver avec une course différente i>. Maintenant, la course est que la copie est faite, puis la valeur d'origine est modifiée, et la fonction est désormais un calcul sur les données stables.
@ERIC, c'est un bon point ... Je pense que dans la plupart des cas, j'ai utilisé cela, il est logique d'utiliser les données obsolètes (telles que l'appel d'un événement), mais je pouvais voir cela être un problème si la valeur copiée avait été disposé sur un autre fil, par exemple.