J'ai trouvé un message ici dans Donc discuter du changement de code requis pour empêcher l'écriture dans un champ statique à partir d'une méthode d'instance, mais pourquoi ne pas être une bonne pratique à le faire? Pourquoi Java Designers a-t-il permis cela alors? En d'autres termes, pourquoi le compilateur ne jette pas une erreur lorsque quelqu'un tente de le faire? P>
3 Réponses :
dans les mots de la documentation "Findbugz": P>
Cette méthode d'instance écrit à un champ statique. Ceci est délicat pour obtenir correctement si plusieurs instances sont manipulées et généralement une mauvaise pratique. P> blockQuote>
qui est de dire que ce n'est pas toujours faux, c'est-à-dire que c'est quelque chose qui est souvent une source d'erreurs. Les objets d'instance manipulent des champs statiques peuvent être utiles par exemple pour une initialisation paresseuse d'objets partagés, de sorte que ce n'est pas toujours faux, mais il peut être difficile de le faire correctement (en particulier si plusieurs threads peuvent être exécutés en même temps). P >
Comment faire fonctionner plusieurs threads exécutant simultanément dans ce code le rendre buggy? Ma question était de recevoir une réponse à cela en fait. Avons-nous la possibilité de créer plusieurs instances du champ?
Il n'y a qu'un seul champ encore, mais si deux d'entre eux essaient tous deux d'écrire à peu près au même moment, vous pouvez vous retrouver avec deux objets créés et le champ changeant, alors que vous ne vouliez probablement qu'une copie de l'objet exister. Cela pourrait causer de graves problèmes dans certains cas, car différentes instances de l'objet propriétaire pourraient utiliser différents objets partagés. Vous auriez besoin de mettre un bloc synchronisé (ce.getClass ()) autour de tout code susceptible de changer le champ statique pour être sûr qu'il a fonctionné.
En plus de ce qui précède, à partir d'un point de vue de la documentation, il est facile de supposer que c'est un champ d'instance, si vous utilisez le formulaire:
myClass.someField = null
Il peut être utile, par exemple si vous avez une application qui gère les fourmis et vous devez pouvoir accéder au nombre total de fourmis créées de la classe Ant. Cela peut être fait en écrivant à une méthode statique qui maintient la trace du nombre total de fourmis à chaque fois que vous créez une nouvelle fourmi écrit à l'addition de méthode statique (); P>