1084 votes

Java: utilisation des méthodes statiques

Je me demande quand à l'utilisation des méthodes statiques? Dire Si j'ai une classe avec un peu de getters et setters, une méthode ou deux, et je veux que ceux des méthodes pour être invokable sur une instance d'objet de la classe. Est-ce à dire que je devrais utiliser une méthode statique?

e.g

Obj x = new Obj();
x.someMethod

ou

Obj.someMethod

(est-ce la manière statique?)

Je suis un peu confus!

1658voto

not-just-yeti Points 3280

Une seule règle-de-pouce: demandez-vous "est-il judicieux d'appeler cette méthode, même si aucune Obj a été construit à l'époque?" Si oui, il devrait certainement être statique.

Ainsi, dans une classe Car vous pouvez avoir une méthode double convertMpgToKpl(double mpg) qui serait statique, car on peut avoir envie de savoir ce que 35mpg convertit, même si personne n'a jamais construit une Voiture. Mais void setMileage(double mpg) (ce qui définit l'efficacité d'une Voiture particulière) ne peut pas être statique, car il est inconcevable pour appeler la méthode avant de la Voiture a été construite.

(Btw, l'inverse n'est pas toujours vrai: vous pouvez parfois avoir une méthode qui implique deux Car objets, et voulez toujours être statique. E. g. Car theMoreEfficientOf( Car c1, Car c2 ). Bien que cela pourrait être converti à un non-version statique, certains diront que depuis il n'y a pas un "privilège" choix de la Voiture est plus important, vous ne devriez pas en vigueur à l'appelant de choisir une Voiture que l'objet que vous allez appeler la méthode. Cette situation représente une assez petite fraction de toutes les méthodes statiques, cependant).

611voto

Mohd Points 1849

Définir des méthodes statiques dans les scénarios suivants uniquement:

  1. Si vous êtes à la rédaction de l'utilitaire de classes et ils ne sont pas censés être modifié.
  2. Si la méthode n'utilise pas de variable d'instance.
  3. Si aucune opération n'est pas dépendante de la création de l'instance.
  4. Si il y a du code qui peut facilement être partagé par toutes les méthodes d'instance, de l'extrait de code dans une méthode statique.
  5. Si vous êtes sûr que la définition de la méthode ne sera jamais modifiée ou remplacée. Comme les méthodes statiques ne peuvent pas être remplacées.

220voto

tetsuo Points 5184

Il y a quelques raisons valables d'utiliser les méthodes statiques:

  • Performance: si vous voulez un peu de code à exécuter, et ne veulent pas instancier un objet supplémentaire de le faire, de la fourrer dans une méthode statique. La JVM peut également optimiser les méthodes statiques beaucoup (je pense que j'ai une fois lu James Gosling en déclarant que vous n'avez pas besoin d'instructions personnalisées dans la JVM, depuis les méthodes statiques seront tout aussi rapides, mais ne pouvait pas trouver la source - ainsi, il peut être complètement faux). Oui, c'est la micro-optimisation, et probablement inutile. Et nous, programmeurs, ne jamais faire les choses inutiles juste parce qu'ils sont cool, non?

  • Pratique: au lieu d'appeler new Util().method(arg), appelez - Util.method(arg)ou method(arg) de l'électricité statique des importations. Plus facile, plus courte.

  • Ajout de méthodes: tu voulais vraiment la classe String pour avoir un removeSpecialChars() méthode d'instance, mais il n'y est pas (et il ne devrait pas, car votre projet de caractères spéciaux peuvent être différents de l'autre du projet), et vous ne pouvez pas l'ajouter (depuis Java est peu sain d'esprit), ainsi, vous créez une classe utilitaire, et appelez - removeSpecialChars(s) au lieu de s.removeSpecialChars(). Doux.

  • Pureté: en prenant quelques précautions, votre méthode statique sera une fonction pure, c'est la seule chose qu'il dépend de ses paramètres. De données dans les données. C'est plus facile à lire et à déboguer, puisque vous n'avez pas l'héritage de caprices à s'inquiéter. Vous pouvez le faire avec des méthodes d'instance, mais le compilateur va vous aider un peu plus avec des méthodes statiques (en ne permettant pas de références à l'instance d'attributs, de méthodes surchargées, etc.).

Vous aurez aussi à créer une méthode statique si vous voulez faire un singleton, mais... ne sont pas. Je veux dire, réfléchir à deux fois.

Maintenant, plus important encore, pourquoi vous ne voulez pas de créer une méthode statique? Fondamentalement, le polymorphisme est en dehors de la fenêtre. Vous ne serez pas en mesure de remplacer la méthode, ni de le déclarer dans l'interface. Il faut beaucoup de souplesse de la conception de votre. Aussi, si vous avez besoin d' état, vous vous retrouverez avec beaucoup de simultanéité des bugs et/ou les goulots d'étranglement si vous n'êtes pas prudent.

Encore plus intéressant, la discussion est d'environ statique à l'intérieur des classes, mais c'est pour une autre fois :)

45voto

Alfred Points 32190

Après la lecture de Misko articles, je crois que les méthodes statiques sont mauvais à partir d'un test de point de vue. Vous devriez avoir des usines à la place(peut-être à l'aide d'une injection de dépendance outil comme Guice).

comment puis-je m'assurer que j'ai une seule chose

avoir un seul de quelque chose Le problème de "comment puis-je m'assurer que je avoir un seul de quelque chose" est bien éludée. Vous instanciez seulement un seul ApplicationFactory dans votre principal, et comme un résultat, vous n' instancier une instance unique de tous les de votre singletons.

La question fondamentale, avec des méthodes statiques, c'est qu'ils sont le code de procédure

La question fondamentale, avec des méthodes statiques est ils sont le code de procédure. Je n'ai pas de idée de la façon de l'unité de test de code de procédure. Tests unitaires suppose que je peux instancier un morceau de ma demande dans l'isolement. Lors de l'instanciation J'fil les dépendances avec on se moque de/de matches amicaux, qui remplacent les dépendances réels. Avec de procédure de programmation: il n'y a rien de "fil" depuis il n'y a pas d'objets, le code et les données sont séparées.

13voto

duffymo Points 188155

Non, les méthodes statiques ne sont pas associées à une instance; ils appartiennent à la classe. Les méthodes statiques sont votre deuxième exemple; les méthodes d'instance sont la première.

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