2010-11-19 37 views
1

Je veux savoir de quelle manière est plus efficace.Méthodes statiques ou non? Variables globales?

  1. Aucune des variables globales, en passant des variables à travers les paramètres, ayant toutes les méthodes statiques

  2. Aucune des variables globales, ayant seule méthode principale statique et la création d'objets de classe principale pour accéder aux méthodes

  3. Utilisez uniquement variables globales, ayant seulement la méthode principale statique et créant l'objet de classe dans la méthode principale pour accéder aux méthodes

J'utilise actuellement la méthode 3 mais je veux savoir ce qui est le plus efficace. Cette classe ne sera utilisée par aucune autre classe en dehors de celle-ci, elle est pratiquement seule.

Exemple de ma structure de code:

public class myClass { 
    private int globalVariable; 

    public static void main(String args[]) { 
     myClass c; 
     c.someMethod(); // Changes global variable from method 
     System.out.println(someMethod); // Prints solution 
    } 

    public void someMethod() {...} 
} 
+6

Réponse courte: ce n'est pas grave. Réponse plus longue: c'est vraiment pas grave. La lisibilité, la fiabilité et la maintenabilité sont les objectifs, pas les micro-optimisations. En outre, Java n'a pas de variables globales. Votre exemple illustre des variables d'instance. Si vous voulez toujours savoir, configurez un test et chronométrez-le. –

+0

+1 pour "test it", Jonathon. Il est fastidieux de lire et de relire les gens qui posent des questions auxquelles on aurait pu répondre avec une dizaine de minutes de travail. –

Répondre

11
  • Aucune classe est une île.
  • Il n'y a pas de boules d'argent, du moins c'est très vrai en programmation.
  • L'optimisation prématurée est la racine de tous les maux.
  • En Java, nous n'avons pas de variables globales. Nous n'avons que des variables de classe, des variables d'instance et des variables de méthode.

[Modifier]

Je suis en train d'expliquer ici mon dernier point. En fait, en apportant la discussion, cela se passe dans les commentaires ci-dessous, au poste actuel.

Regardez d'abord cela, an SO thread of C#. Là les gens sont aussi ce qui suggère la même chose, ce qui est,

Alors, on y va.

correction: Les classes ont une portée globale et toutes les variables de classe ont donc une portée globale. D'où devrait être appelé global.

Contre-réaction: Toutes les classes n'ont pas une portée globale. Une classe peut être package-private. Par conséquent, les variables static ne seront pas visibles en dehors du package. Par conséquent, ne devrait pas être appelé comme global. En outre, les classes peuvent être imbriquées, donc peuvent également être private et peuvent certainement avoir des variables static mais celles-ci ne seraient pas appelées globales.

cornue:public classes sont globalement scope, et donc toutes les variables de classe sont globalement scope.

contre-réplique: Pas exactement.Je voudrais déplacer l'argument précédent ici mais sur un niveau variable. Peu importe si la classe elle-même est public. Les variables peuvent être protected, package-private et private. Par conséquent, les variables static ne seront pas globales dans ce cas.

Maintenant, si vous voulez appeler public static variable dans public static classe, comme globale, puis l'appeler par tous les moyens. Mais considérez ceci, quand vous créez un nouveau ClassLoader (en tant qu'enfant du bootstrap ClassLoader) et chargez une classe que vous avez déjà chargée. Ensuite, cela se traduit par une "très nouvelle copie de la classe" - complète avec son propre nouvel ensemble de static s. Très "non-global", en effet. Cependant, nous n'utilisons pas le mot global en Java parce qu'il a tendance à confondre les choses et ensuite nous devons venir avec beaucoup d'explications juste pour que tout soit clair. Les gens aiment à juste titre expliquer la caractéristique des variables global en Java par static variables. Il n'y a pas de problème à cela. Si vous avez un problème/code dans une autre langue et que vous utilisez des variables globales et que vous devez convertir ce code en Java, alors vous utiliserez probablement la variable static comme alternative.

Quelques exemples que je tiens à rendre ici

  1. Quand j'ai commencé Java, les instructeurs aiment expliquer la différence de passage variable de type d'objet et variables primitives. Et ils utilisent constamment le terme objets sont pass-by-reference, tandis que les primitives sont pass-by-value. Les étudiants ont trouvé cette explication assez confuse. Donc, nous avons eu l'idée que tout ce qui est en Java est la valeur de transmission. Et nous expliquons que pour les objets, les références sont des valeurs pass-by. Cela devient beaucoup plus clair et simple.

  2. De même, il existe des langages prenant en charge l'héritage multiple. Mais Java ne le fait pas, encore une fois sans doute parlant. Mais les gens ont tendance à expliquer cette caractéristique en utilisant interface s. Ils l'expliquent en implémentant de nombreuses interfaces par classe et l'appellent multiple-inheritance. C'est parfaitement bien. Mais ce que la classe, en réalité, reçoit en héritant d'un certain nombre d'interfaces. Franchement parlant, rien. Pourquoi?

    . Parce que toutes les variables dans les interfaces sont implicitement public, final et static, ce qui signifie apparemment que ceux-ci appartiennent à la classe et tout le monde peut y accéder. Maintenant nous pouvons dire que peut-être il y aura quelques inner class dans l'interface, alors la classe implémentant l'interface l'aura. Mais encore une fois ce sera static implicitement et appartiendra à l'interface. Par conséquent, tout ce que la classe obtiendra sont des méthodes. Et n'oublions pas seulement la définition et le contrat qui dit, "la classe implémentant cette interface doit fournir l'implémentation de toutes les méthodes ou se déclarer abstract". Par conséquent, cette classe n'aura que des responsabilités et rien de plus. Mais cela résout nos problèmes de manière brillante.

Bottom line

Par conséquent, nous disons

  • Il n'y a pas de variables globales en Java
  • Java ne supporte pas l'héritage multiple, mais quelque chose comme ça peut être réalisé en mettant en œuvre plusieurs interfaces.Et cela fonctionne vraiment
  • Il n'y a rien de passage par référence en Java, mais les références sont passent par valeur

Maintenant, j'aime le site quelques endroits

  • Java ne ne supporte pas les variables globales, universellement accessibles. Vous pouvez obtenir les mêmes types d'effets avec des classes qui ont des variables statiques [Ref]
  • Cependant, extern dans ObjectiveC n'est pas une alternative à une variable statique de portée de classe en Java, en fait c'est plus comme une variable globale ... donc utilisez avec mise en garde. [Ref]
  • Au lieu des variables globales comme dans C/C++, Java permet des variables dans une classe à déclarer statique [Ref]
  • De plus, l'utilisation excessive des membres statiques peut conduire à des problèmes similaires à ceux rencontrés dans des langues comme C et C++ qui prennent en charge les variables globales et les fonctions globales. [Ref]

Tous ces éléments déduisent une seule et même idée. Ce qui est Java ne supporte pas les variables globales.

Enfer, j'ai écrit ça. Désolé les gens.

+1

Je ne suis pas d'accord avec votre dernière puce - les classes sont globalement étendues, et donc toutes les variables de classe ont une portée globale. – gustafc

+0

@gustafc: BTW, une variable de classe n'est pas une variable globale, sans doute. Eh bien, vous pouvez essayer de le voir de cette façon que nous essayons d'éviter toute confusion. Dans certaines langues, le terme "variable statique" n'est généralement pas utilisé, car "local" et "global" suffisent à couvrir toutes les possibilités. Mais en Java ce n'est pas le cas, alors nous l'évitons complètement. –

+0

@gustafc: Global signifie, au moins pour certaines personnes venant de langues différentes, une variable qui est également en dehors de toute classe, donc global est un sens réel. J'espère que vous obtenez mon point. Vous pouvez essayer de chercher "variables globales dans Java", vous trouverez certainement des résultats qui suggèrent la même chose. –

0

La performance n'a pas d'importance. Vous voulez qu'il soit aussi facile à lire que possible.

Je ferais 2 autant que vous le pouvez. Lorsque vous avez vraiment besoin de constantes et de statique, faites des constantes et des statiques.

Par exemple, un découpage null null constitue une bonne méthode statique. New Upping un StringTrimmer est stupide. Mettre si null alors x sinon z dans 1000 autres est stupide.

+2

Je pense qu'il est plutôt idiot de dire que "la performance n'a pas d'importance" sans qualification. Oui * la plupart des micro-optimisations ne valent probablement pas l'effort, mais de temps en temps elles le sont. Il est utile de connaître la différence entre les deux cas plutôt que de simplement dire que cela n'a pas d'importance. –

0

Je pense que cela a été réglé en 1956 et 1958, quand les gens ont inventé Lisp et ALGOL58 et Réfléchissant, modularité , transparence référentielle et le code sonore la structure comme moyen pour lutter contre le code spaghetti impénétrable qui comptent sur les variables globales (Je veux dire sérieusement, nous sommes en 2011 et nous nous demandons toujours s'il faut utiliser des variables globales sur des champs encapsulés ou des paramètres passant pour guillemet-c efficacité. Je veux dire, sérieusement.

je paraître arrogant (ainsi soit-il), mais je vais dire ceci:.

Je peux comprendre quelques espaces où vous devez faire une sorte de variable globale compromis (.ie très plates-formes embarquées contraintes par les ressources, par exemple). Je peux comprendre si une personne qui commence juste à CS (dites un étudiant de première année) demande cela. Mais si quelqu'un au-delà du niveau d'étudiant de première année (encore moins quelqu'un qui fait le codage pour vivre et ne codage pas dans la plupart des environnements stériles) demande ou même pense à distance à ce sujet comme une chose acceptable à faire devrait reconsidérer sérieusement revenir à les bases (ou reconsidérer cette profession - nous avons déjà trop de code craptacular déjà.

Réponse courte et concise: Non, cela n'a aucun sens. Il n'y a pas de jeux perceptibles. Ça ne vaut pas le coup. Cela conduit à un code craptaculaire. Et tout cela est connu depuis 50 ans maintenant.