671 votes

Pourquoi sont variables statiques considéré comme mauvais?

Je suis un programmeur Java qui est nouveau dans le monde de l'entreprise. Récemment, j'ai développé une application à l'aide de Groovy et de Java. Tous à travers le code que j'ai utilisé un bon nombre de la statique. J'ai été invité par la technique principal de beaucoup de couper vers le bas sur le nombre de la statique utilisé. J'ai googlé sur le même, et je trouve que beaucoup de programmeurs sont plutôt contre l'utilisation de variables statiques.

- Je trouver des variables statiques, plus pratique à utiliser. Et je présume qu'ils sont efficaces aussi (corrigez-moi si je me trompe), parce que si je devais faire 10 000 appels à une fonction au sein d'une classe, je serais heureux de faire de la méthode statique et l'utilisation d'un simple class.methodCall() sur elle au lieu d'encombrer la mémoire avec 10 000 instances de la classe, non?

En outre statique réduire les inter-dépendances sur d'autres parties du code. Ils peuvent agir comme parfait état titulaires. En ajoutant à cela je trouve que les statistiques sont largement mis en œuvre dans certains langages comme Smalltalk et de la Scala. Alors pourquoi est-ce l'oppression pour la statique répandue parmi les programmeurs (en particulier dans le monde de Java)?

PS: merci de ne corrigez-moi si mes hypothèses à propos de la statique sont mauvais.

736voto

Jon Skeet Points 692016

Les variables statiques représentent l'état global. C'est difficile à comprendre et difficile à tester: si je crée une nouvelle instance d'un objet, je peux raisonner sur son nouvel état dans les tests. Si j'utilise le code qui est à l'aide de variables statiques, il pourrait être dans n'importe quel état et n'importe quoi peut être de le modifier.

Je pourrais continuer pendant un certain temps, mais le grand concept pour penser, c'est que plus la portée de quelque chose, plus il est facile de raisonner sur. Nous sommes très bons à penser au sujet de petites choses, mais il est difficile de raisonner sur l'état d'un million de système en ligne si il n'y a pas de modularité. Cela s'applique à toutes sortes de choses, par la voie - et pas seulement les variables statiques.

291voto

Jessica Brown Points 3042

Son pas très orientée objet: L'une des raisons de la statique pourrait être considéré comme "mal" par certaines personnes, c'est qu'ils sont contraire, le paradigme orienté objet. En particulier, il viole le principe que les données sont encapsulées dans des objets (qui peuvent être étendus, se cacher de l'information, etc). La statique, de la manière que vous décrivez à l'aide de eux, sont essentiellement les utiliser comme une variable globale pour éviter de faire face à des questions comme la portée. Cependant, les variables globales est l'une des caractéristiques déterminantes de la procédure ou de la programmation impérative paradigme, pas une caractéristique de la "bonne" code orienté objet. Ce n'est pas à dire que la procédure de paradigme est mauvais, mais j'ai l'impression que votre superviseur vous attend à l'écriture de "bon code orienté objet" et vous êtes vraiment désireux d'écrire "bon code de procédure".

Il y a beaucoup de gotchyas en Java lorsque vous commencez à utiliser des variables statiques qui ne sont pas toujours évidentes. Par exemple, si vous avez deux copies de votre programme en cours d'exécution dans la même machine virtuelle, vont-ils shre la statique de la valeur de la variable et le désordre de l'état de chacun des autres? Ou ce qui se passe quand vous étendez la classe, vous pouvez remplacer le membre statique? Est votre VM en cours d'exécution hors de la mémoire parce que vous avez aliéné des numéros de la statique et que la mémoire ne peut pas être récupérée à d'autres objets d'instance?

Durée De Vie Des Objets: En outre, la statique ont une durée de vie qui correspond à l'ensemble de l'exécution du programme. Cela signifie que, même une fois que vous avez fini d'utiliser votre classe, la mémoire de l'ensemble de ces variables statiques ne peuvent pas être nettoyés. Si, par exemple, au lieu de cela, vous avez fait vos variables non statique, et dans votre fonction main() vous faites une seule instance de votre classe, et demanda alors à votre classe pour exécuter une fonction particulière de 10 000 fois, une fois ces 10 000 appels ont été faites, et que vous supprimez vos références à l'instance unique, toutes vos variables statiques pourrait être nettoyés et réutilisés.

Empêche certaines ré-utiliser: Aussi, les méthodes statiques ne peuvent pas être utilisés pour implémenter une interface, de sorte que les méthodes statiques ne peuvent empêcher certains orientée objet dispose d'être utilisables.

D'Autres Options: Si l'efficacité est votre préoccupation principale, il y a peut être d'autres de meilleures façons de résoudre le problème de vitesse que de considérer seulement l'avantage de l'invocation étant généralement plus rapide que la création. Examiner si le transitoire et la volatilité de la modificateurs sont nécessaires partout. Pour préserver la capacité à être incorporé, une méthode pourrait être marqué comme final au lieu de statique. Les paramètres de la méthode et d'autres variables peuvent être marqués en finale pour permettre à certaines compilateur optimiazations fondées sur des hypothèses sur ce qui peut modifier ces variables. Une instance de l'objet peut être réutilisé plusieurs fois plutôt que de créer une nouvelle instance à chaque fois. Il peut être compliler commutateurs d'optimisation doit être activée pour que l'application en général. Peut-être, la conception devrait être mis en place afin que les 10 000 pistes peuvent être multi-threaded et profiter de multi-cœurs de processeur. Si portablity n'est pas une préoccupation, peut-être une méthode native vous obtenir une meilleure vitesse de votre statique faire.

Si, pour une raison quelconque vous ne voulez pas de copies multiples d'un objet, le modèle de conception singleton, a des avantages sur les objets statiques, tels que le fil de sécurité (à condition que votre singleton est codée bien), permettant paresseux-initialisation, garantissant que l'objet a été initialisé correctement lorsqu'il est utilisé, sous-classements, des avantages pour les essais et la refactorisation de votre code, pour ne pas mentionner, si vous changez d'avis à propos de seulement vouloir une instance d'un objet, il est BEAUCOUP plus facile d'enlever le code pour empêcher la duplication des cas que c'est de revoir tous vos variable statique de code pour utiliser les variables d'instance. J'ai eu à le faire avant, ce n'est pas amusant, et vous finissez par avoir à modifier beaucoup de classes, ce qui augmente votre risque d'introduire de nouveaux bugs...tellement mieux de mettre les choses en place "la droite" la première fois, même si on dirait qu'elle a ses inconvénients. Pour moi, le travail de base nécessaire si vous décidez sur la route, vous avez besoin de plusieurs copies de quelque chose qui est probablement l'une des meilleures raisons pour utiliser la statique aussi rarement que possible. Et donc je voudrais également en désaccord avec l'énoncé que la statique de réduire les inter-dépendances, je pense que vous allez vous retrouver avec du code qui n'est plus couplée si vous avez beaucoup de statique, qui peut être directement accessibles, plutôt qu'un objet qui "sait comment faire quelque chose" sur lui-même.

97voto

Preet Sangha Points 39414

Le mal est une notion subjective.

Vous n'avez pas le contrôle de la statique en termes de création et de destruction. Ils vivent à la demande du programme de chargement et de déchargement.

Depuis la statique vivre dans un même espace, tous les threads qui le souhaitent doivent passer par le contrôle d'accès que vous avez à gérer. Cela signifie que les programmes sont de plus couplé et ce changement est plus difficile à prévoir et à gérer (comme J Skeet dit). Cela conduit à des problèmes d'isoler l'impact du changement et donc affecte la façon dont le test est réussi.

Ce sont les deux principaux problèmes que j'ai avec eux.

60voto

irreputable Points 25577

Pas de. Les états globaux ne sont pas mauvaises en soi. Mais il nous faut voir ton code pour voir si on s'en sert correctement. Il est tout à fait possible qu'un débutant violations des états globaux; tout comme il serait abus chaque fonctionnalité du langage.

Les états globaux sont d'une nécessité absolue. Nous ne pouvons pas éviter d'états globaux. Nous ne pouvons pas éviter de raisonner sur les états globaux. - Si nous nous soucions de comprendre notre sémantique de l'application.

Les gens qui essaient de se débarrasser d'états globaux pour l'amour d'elle, inévitablement finir avec un système beaucoup plus complexe - et les états globaux sont toujours là, savamment/idiotement déguisée sous de nombreuses couches de indirections; et nous avons encore à raisonner sur les états globaux, après le déballage de tous les indirections.

Comme le Printemps des personnes qui somptueusement déclarer états globaux dans xml et de penser d'une certaine manière c'est de qualité supérieure.

@Jon Skeet if I create a new instance of an object maintenant vous avez deux choses à la raison, à savoir l'état au sein de l'objet, et l'état de l'environnement d'hébergement de l'objet.

32voto

sternr Points 2163

Il existe 2 principaux problèmes avec les variables statiques:

  • Fil de Sécurité - les ressources statiques sont, par définition, pas thread-safe
  • Code Implicity - Vous ne savez pas quand une variable statique est instancié et si oui ou non il sera instancié avant une autre variable statique

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