Question Java: quand utiliser des méthodes statiques


Je me demande quand utiliser des méthodes statiques? Dites si j'ai une classe avec quelques getters et setters, une méthode ou deux, et je veux que ces méthodes soient seulement invocables sur un objet d'instance de la classe. Est-ce que cela signifie que je devrais utiliser une méthode statique?

par exemple

Obj x = new Obj();
x.someMethod

ou

Obj.someMethod

(est-ce la manière statique?)

Je suis plutôt confus!


715
2018-04-19 23:05


origine


Réponses:


Une règle générale: demandez-vous «est-il logique d'appeler cette méthode, même si aucun objectif n'a encore été construit? Si c'est le cas, il devrait définitivement être statique.

Donc dans une classe Car vous pourriez avoir une méthode double convertMpgToKpl(double mpg) ce qui serait statique, car on pourrait vouloir savoir à quoi convertit 35mpg, même si personne n'a jamais construit une voiture. Mais void setMileage(double mpg) (qui définit l'efficacité d'une voiture particulière) ne peut pas être statique car il est inconcevable d'appeler la méthode avant qu'une voiture ait été construite.

(Btw, l'inverse n'est pas toujours vrai: vous pourriez parfois avoir une méthode qui implique deux Car objets, et veulent toujours être statique. Par exemple. Car theMoreEfficientOf( Car c1, Car c2 ). Bien que cela puisse être converti en une version non statique, certains diront que puisqu'il n'y a pas de choix "privilégié" dont Car est plus important, vous ne devriez pas forcer un appelant à choisir une voiture comme objet. invoque la méthode sur. Cependant, cette situation représente une fraction relativement faible de toutes les méthodes statiques.)


1176
2018-04-19 23:42



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

  1. Si vous écrivez des classes d'utilité et qu'elles ne sont pas supposées être modifiées.
  2. Si la méthode n'utilise aucune variable d'instance.
  3. Si une opération ne dépend pas de la création de l'instance.
  4. S'il y a du code qui peut facilement être partagé par toutes les méthodes d'instance, extrayez ce 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 annulée. Comme les méthodes statiques ne peuvent pas être remplacées.

458
2018-03-15 14:40



Il existe des raisons valables d'utiliser des méthodes statiques:

  • Performance: si vous voulez que du code soit exécuté et que vous ne souhaitiez pas instancier un objet supplémentaire pour le faire, insérez-le dans une méthode statique. La JVM peut aussi optimiser beaucoup les méthodes statiques (je crois avoir déjà lu James Gosling affirmant que vous n'avez pas besoin d'instructions personnalisées dans la JVM, puisque les méthodes statiques seront aussi rapides, mais ne trouveront pas la source - donc ça pourrait être complètement faux). Oui, c'est la micro-optimisation, et probablement inutile. Et nous les programmeurs ne faisons jamais des choses inutiles juste parce qu'ils sont cool, non?

  • Praticité: au lieu d'appeler new Util().method(arg), appel Util.method(arg), ou method(arg) avec des importations statiques. Plus facile, plus court.

  • Ajout de méthodes: vous vouliez vraiment la classe String d'avoir un removeSpecialChars() méthode d'instance, mais elle n'est pas là (et elle ne devrait pas, puisque les caractères spéciaux de votre projet peuvent être différents des autres projets), et vous ne pouvez pas l'ajouter (puisque Java est un peu sain), vous créez une classe utilitaire, et appel removeSpecialChars(s) au lieu de s.removeSpecialChars(). Doux.

  • Pureté: en prenant quelques précautions, votre méthode statique sera un fonction purec'est-à-dire que la seule chose dont il dépend est ses paramètres. Données dans, données sortantes. Ceci est plus facile à lire et à déboguer, car vous n'avez pas à vous soucier des bizarreries de l'héritage. Vous pouvez aussi le faire avec des méthodes d'instance, mais le compilateur vous aidera un peu plus avec les méthodes statiques (en n'autorisant pas les références aux attributs d'instance, les méthodes de remplacement, etc.).

Vous devrez également créer une méthode statique si vous voulez créer un singleton, mais ... ne le faites pas. Je veux dire, réfléchis deux fois.

Maintenant, plus important encore, pourquoi tu ne voudrais pas créer une méthode statique? Fondamentalement, le polymorphisme sort de la fenêtre. Vous ne pourrez pas remplacer la méthode, ni le déclarer dans une interface  (pré-Java 8). Il faut beaucoup de flexibilité de votre conception. Aussi, si vous avez besoin Etat, vous allez vous retrouver avec beaucoup de bogues de concurrence et / ou des goulots d'étranglement si vous ne faites pas attention.


138
2017-12-11 15:03



Après avoir lu les articles de Misko, je crois que méthodes statiques sont mauvais du point de vue du test. Tu aurais dû des usines au lieu de cela (peut-être en utilisant un outil d'injection de dépendance comme Guice).

comment puis-je m'assurer que je n'ai qu'un de quelque chose

seulement en avoir un de quelque chose   Le problème de "comment puis-je m'assurer que je   seulement avoir quelque chose "est bien   esquivé. Vous instancier seulement un   ApplicationFactory unique dans votre   principal, et par conséquent, vous seul   instancier une seule instance de tous   de vos singletons.

Le problème de base avec les méthodes statiques est qu'ils sont code de procédure

Le problème de base avec les méthodes statiques est   ce sont des codes de procédure. je n'ai pas   idée comment tester unitairement le code procédural.   Les tests unitaires supposent que je peux   instancier une partie de mon application   en isolation. Pendant l'instanciation   Je câline les dépendances avec   faux-semblants / friendlies qui remplacent le   vraies dépendances. Avec procédure   la programmation il n'y a rien à "câbler"   puisqu'il n'y a pas d'objets, le code   et les données sont séparées.


37
2018-04-20 01:14



UNE static méthode est un type de méthode qui n'a besoin d'aucun objet à initialiser pour être appelé. As-tu remarqué static est utilisé dans le main fonctionner en Java? L'exécution du programme commence à partir de là sans qu'un objet soit créé.

Considérez l'exemple suivant:

 class Languages 
 {
     public static void main(String[] args) 
     {
         display();
     }

     static void display() 
     {
         System.out.println("Java is my favorite programming language.");
     }
  }

26
2018-06-10 09:59



Les méthodes statiques dans java appartiennent à la classe (pas une instance de celle-ci). Ils n'utilisent aucune variable d'instance et prennent généralement en compte les paramètres, effectuent des actions dessus, puis retournent un résultat. Les méthodes instances sont associées à des objets et, comme son nom l'indique, peuvent utiliser des variables d'instance.


15
2018-04-19 23:08



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 les premières.


10
2018-04-19 23:08



Si vous appliquez un mot-clé statique avec n'importe quelle méthode, il s'agit d'une méthode statique.

  1. Une méthode statique appartient à la classe plutôt qu'à l'objet d'une classe.
  2. Une méthode statique appelée sans avoir besoin de créer une instance d'une classe.
  3. méthode statique peut accéder au membre de données statiques et peut changer la valeur de celui-ci.

// Programme de modification de la propriété commune de tous les objets (champ statique).

class Student9{  
 int rollno;  
 String name;  
 static String college = "ITS";  

 static void change(){  
 college = "BBDIT";  
 }  

 Student9(int r, String n){  
 rollno = r;  
 name = n;  
 }  

 void display (){System.out.println(rollno+" "+name+" "+college);}  

public static void main(String args[]){  
Student9.change();  

Student9 s1 = new Student9 (111,"Indian");  
Student9 s2 = new Student9 (222,"American");  
Student9 s3 = new Student9 (333,"China");  

s1.display();  
s2.display();  
s3.display();  
}  }

O / P: 111 indienne BBDIT        222 BBDIT américain        333 Chine BBDIT


9
2018-06-13 16:10



Les méthodes statiques n'étant pas associées à une instance, elles ne peuvent accéder à aucun champ non statique de la classe.

Vous utiliseriez une méthode statique si la méthode n'utilisait pas de champs (ou seulement des champs statiques) d'une classe.

Si des champs non statiques d'une classe sont utilisés, vous devez utiliser une méthode non statique.


6
2018-04-19 23:12



En fait, nous utilisons des propriétés et des méthodes statiques dans une classe, quand nous voulons utiliser une partie de notre programme devrait exister jusqu'à ce que notre programme soit en cours d'exécution. Et nous savons que, pour manipuler les propriétés statiques, nous avons besoin de méthodes statiques car elles ne font pas partie de la variable d'instance. Et sans méthodes statiques, manipuler les propriétés statiques prend du temps.


6
2018-03-11 04:56