Java: quand utiliser des méthodes statiques

je me demande quand utiliser des méthodes statiques? Disons que j'ai une classe avec quelques getters et setters, une méthode ou deux, et je veux que ces méthodes ne soient invokables que sur un objet instance de la classe. Cela signifie-t-il que je devrais utiliser une méthode statique?

E. g

Obj x = new Obj();
x.someMethod

ou

Obj.someMethod

(est-ce la voie statique?)

je suis un peu confus!

733
demandé sur Community 2010-04-20 03:05:33

20 réponses

Une 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.

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

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

1211
répondu not-just-yeti 2010-04-19 23:56:15

Définir des méthodes statiques dans les cas suivants seulement:

  1. si vous écrivez des classes d'utilité et qu'elles ne sont pas censé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 un code qui peut facilement être partagé par toutes les méthodes d'instance, extraire 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 remplacée. Comme les méthodes statiques ne peuvent pas être remplacées.
470
répondu Mohd 2013-03-01 19:36:32

il y a des raisons valables pour utiliser des méthodes statiques:

  • Performance : si vous voulez qu'un code soit lancé et que vous ne voulez pas instancier un objet supplémentaire pour le faire, mettez-le dans une méthode statique. La JVM peut également optimiser les méthodes statiques beaucoup (je pense que J'ai lu une fois James Gosling déclarant que vous n'avez pas besoin d'instructions personnalisées dans la JVM, puisque les méthodes statiques sera tout aussi rapide, mais ne pouvait pas trouver la source - donc il 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, pas vrai?

  • aspect pratique : au lieu d'appeler new Util().method(arg) , appeler Util.method(arg) , ou method(arg) avec des importations statiques. Plus facile, plus courte.

  • ajouter des méthodes : vous avez vraiment voulu le Class String pour avoir une méthode d'instance removeSpecialChars() , mais elle n'est pas là (et elle ne devrait pas, puisque les caractères spéciaux de votre projet peuvent être différents de ceux de l'autre projet), et vous ne pouvez pas l'ajouter (puisque Java est un peu sain), donc 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 les méthodes d'instance aussi, mais le compilateur vous aidera un peu plus avec les méthodes statiques (en ne permettant pas les références aux attributs d'instance, aux méthodes de dépassement, etc.).).

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

maintenant, plus important, pourquoi ne pas vouloir pour créer une méthode statique? Fondamentalement, polymorphisme sort de la fenêtre . Vous ne pourrez pas outrepasser la méthode, ni la déclarer dans une interface (pré-Java 8) . Il faut beaucoup de flexibilité à partir de votre conception. Aussi, si vous avez besoin de état , vous finirez up avec beaucoup de bogues de concurrence et / ou des goulots d'étranglement si vous n'êtes pas prudent.

143
répondu tetsuo 2017-05-09 13:19:12

après avoir lu les articles de Misko je crois que méthodes statiques sont mauvais d'un point de vue de test. Vous devriez avoir usines à la place (peut-être en utilisant un outil d'injection de dépendance comme Guice ).

comment puis-je m'assurer que je n'ai qu'une chose

ont seulement un 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 simple ApplicationFactory dans votre principal, et en conséquence, vous seulement instanciate une seule instance de tous de votre singletons.

le problème fondamental avec les méthodes statiques est qu'elles sont un code de procédure

le problème de base avec les 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. Les tests unitaires supposent que je peux instancier un morceau de ma demande isolément. Pendant l'instanciation Je connecte les dépendances avec moqueries / amitiés qui remplacent les dépendances réels. Avec de procédure programmer il n'y a rien à "télégraphier"" depuis il n'y a pas d'objets, le code et les données sont séparées.

38
répondu Alfred 2010-04-20 01:14:45

a static méthode est un type de méthode qui n'a pas besoin d'objet à initialiser pour qu'il soit appelé. Avez-vous remarqué que static est utilisé dans la fonction main en Java? L'exécution du programme commence à partir de là sans qu'un objet ne soit créé.

prenons l'exemple suivant:

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

     static void display() 
     {
         System.out.println("Java is my favorite programming language.");
     }
  }
29
répondu Zishan 2016-11-28 21:20:29

les méthodes statiques en java appartiennent à la classe (pas à une instance de celle-ci). Ils n'utilisent pas de variables d'instance et vont généralement prendre des entrées à partir des paramètres, effectuer des actions dessus, puis retourner quelques résultats. Les méthodes Instances sont associées à des objets et, comme leur nom l'indique, peuvent utiliser des variables d'instance.

15
répondu Kevin Sylvestre 2010-04-19 23:08:26

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

10
répondu duffymo 2010-04-19 23:08:32

si vous appliquez le mot-clé statique avec n'importe quelle méthode, il est connu comme méthode statique.

  1. Une méthode statique appartient à la classe plutôt qu'un objet d'une classe.
  2. méthode statique invoquée sans nécessité de créer une instance d'une classe.
  3. méthode statique peut accéder à des données statiques membre et peuvent modifier la valeur.

//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 Indian BBDIT 222 American BBDIT 333 China BBDIT

9
répondu IndianProgrammer1234 2015-06-13 16:10:09

les méthodes statiques ne sont pas associées à une instance, de sorte qu'elles ne peuvent pas accéder à des champs non statiques dans la classe.

vous utiliseriez une méthode statique si la méthode n'utilise aucun champ (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
répondu Carsten 2010-04-19 23:12:03

en fait, nous utilisons des propriétés statiques et des méthodes dans une classe, quand nous voulons utiliser une partie de notre programme devrait exister là jusqu'à ce que notre programme est 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
répondu Sagar 2013-03-11 04:56:52

Utiliser une méthode statique lorsque vous voulez être en mesure d'accéder à la méthode sans une instance de la classe.

4
répondu Jamey 2010-04-19 23:08:46

les méthodes et variables statiques sont des versions contrôlées de fonctions et variables 'globales' en Java. Dans laquelle les méthodes peuvent être consultées comme classname.methodName() ou classInstanceName.methodName() , c.-à-d. les méthodes et variables statiques peuvent être consultées en utilisant le nom de classe ainsi que des instances de la classe.

La classe

ne peut pas être déclarée statique(parce qu'elle n'a pas de sens. si une classe est déclarée publique, elle peut être accessible de n'importe où), les classes internes peuvent être déclarées statiques.

4
répondu Manju Yadav 2012-11-10 16:22:49

statique: Obj.someMethod

utilisez static lorsque vous voulez fournir un accès au niveau de la classe à une méthode, i.e. où la méthode devrait être appelable sans une instance de la classe.

3
répondu Finbarr 2010-04-19 23:10:52

méthodes Statiques n'ont pas besoin d'être appelée sur l'objet et c'est lorsque vous l'utilisez. Exemple: votre Main () est statique et vous ne créez pas un objet pour l'appeler.

3
répondu Vaishak Suresh 2010-04-20 05:21:20

les méthodes statiques peuvent être utilisées si

  • on ne veut pas effectuer une action sur une instance (méthodes d'utilité)

    comme mentionné dans peu de réponses ci-dessus dans ce post, la conversion des miles en kilomètres, ou le calcul de la température de Fahrenheit à Celsius et vice-versa. Avec ces exemples utilisant la méthode statique, il n'a pas besoin d'instancier tout nouvel objet dans la mémoire tas. Voir ci-dessous

    1. new ABCClass(double farenheit).convertFarenheitToCelcium() 
    2. ABCClass.convertFarenheitToCelcium(double farenheit)
    

    le premier crée une nouvelle empreinte de classe pour chaque méthode invoquer, 1519160920" Performance, pratique . Des exemples sont les mathématiques et Apache-classe de la bibliothèque commune StringUtils ci-dessous:

    Math.random()
    Math.sqrt(double)
    Math.min(int, int)
    StringUtils.isEmpty(String)
    StringUtils.isBlank(String)
    
  • on veut utiliser comme une fonction simple. Les entrées sont passées explicitement, et reçoivent les données de résultat comme valeur de retour. L'héritage, de l'objet l'instanciation n'entre pas en scène. Concis, Lisible .

NOTE : Peu de gens s'opposent à la testabilité des méthodes statiques, mais les méthodes statiques peuvent être testées aussi! Avec jMockit, on peut se moquer des méthodes statiques. testabilité . Exemple ci-dessous:

new MockUp<ClassName>() {
    @Mock
    public int doSomething(Input input1, Input input2){
        return returnValue;
    }
};
3
répondu Amit Kaneria 2016-08-23 15:37:37

les méthodes statiques sont les méthodes en Java qui peuvent être appelées sans créer un objet de classe. Il est appartiennent à la classe.

nous utilisons la méthode statique quand nous n'avons pas besoin d'invoquer la méthode en utilisant l'instance.

3
répondu rashedcs 2017-05-28 08:57:18

je me demande quand utiliser des méthodes statiques?

  1. une utilisation courante des méthodes static est d'accéder aux champs static .
  2. mais vous pouvez avoir les méthodes static , sans faire référence aux variables static . Les méthodes d'aide sans référence à la variable static peuvent être trouvées dans certaines classes java comme java.lang.Mathématiques

    public static int min(int a, int b) {
        return (a <= b) ? a : b;
    }
    
  3. l'autre cas d'utilisation, je peux penser à ces méthodes combinées avec la méthode synchronized est la mise en œuvre de verrouillage de niveau de classe dans un environnement fileté multiple.

dire si j'ai une classe avec quelques getters et setters, une méthode ou deux, et je veux que ces méthodes soient seulement invokable sur un objet d'instance de la classe. Cela signifie-t-il que je devrais utiliser une méthode statique?

si vous avez besoin d'accéder à la méthode sur un objet instance de la classe, votre méthode devrait être non statique.

documentation Oracle page fournit plus de détails.

toutes les combinaisons de variables et de méthodes d'instance et de classe ne sont pas autorisées:

  1. les méthodes D'Instance peuvent accéder directement aux variables d'instance et aux méthodes d'instance.
  2. les méthodes D'Instance peuvent accédez directement aux variables de classe et aux méthodes de classe.
  3. Les méthodes de classe
  4. peuvent accéder directement aux variables de classe et aux méthodes de classe.
  5. Les méthodes de classe
  6. ne peuvent pas accéder directement aux variables d'instance ou aux méthodes d'instance-elles doivent utiliser une référence d'objet. En outre, les méthodes de classe ne peuvent pas utiliser ce mot-clé car il n'y a aucune instance à laquelle se référer.
2
répondu Ravindra babu 2017-07-24 17:12:29

dans eclipse vous pouvez activer un avertissement qui vous aide à détecter les méthodes statiques potentielles. (Au-dessus de la ligne mise en évidence est un autre que j'ai oublié de surligner)

eclipse setting

1
répondu user489872 2017-03-06 10:32:23

Une méthode statique a deux buts principaux:

  1. pour les méthodes d'utilité ou d'aide qui ne requièrent aucun état d'objet. Comme il n'est pas nécessaire d'accéder aux variables d'instance, ayant statique méthodes élimine la nécessité pour l'appelant pour instancier l'objet juste à appeler la méthode.
  2. Pour l'état qui est partagée par tous exemples de la classe, comme un compteur. Toutes les instances doivent partager même état. Méthodes qui utilisent simplement cet état doit être statique comme bien.
1
répondu hemanto 2018-02-05 07:42:23

les méthodes statiques doivent être appelées sur la classe, les méthodes D'Instance doivent être appelées sur les Instances de la classe. Mais qu'est-ce que cela signifie en réalité? Voici un exemple utile:

une classe de voiture peut avoir une méthode D'instance appelée Accelerate(). Vous ne pouvez accélérer une voiture, si la voiture existe réellement (a été construit) et donc ce serait une méthode d'instance.

une classe de voiture peut aussi avoir une méthode de comptage appelée GetCarCount (). Cela ramènerait le nombre total de wagons créés (ou construits). Si aucun Wagon n'a été construit, cette méthode retournerait 0, mais elle devrait quand même pouvoir être appelée, et donc elle devrait être une méthode statique.

1
répondu Charlie Seligman 2018-04-25 14:28:00