web-dev-qa-db-fra.com

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 invocables uniquement sur un objet 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!

848
KP65

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

Ainsi, dans une classe Car, vous pourriez avoir une méthode double convertMpgToKpl(double mpg) qui serait statique, car vous voudrez peut-être savoir en quoi 35mpg est converti, même si personne n'a jamais construit de 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 n'ait été construite.

(Btw, l'inverse n'est pas toujours vrai: vous pouvez parfois avoir une méthode qui implique deux objets Car et que vous voulez toujours qu'elle soit statique. Par exemple, Car theMoreEfficientOf( Car c1, Car c2 ). Bien que cela puisse être converti en objet non version statique, certains diraient que, puisqu'il n'y a pas de choix "privilégié" de quelle voiture est plus important, vous ne devriez pas forcer un appelant à choisir une voiture comme objet de la méthode sur laquelle vous invoquerez la méthode. pour une assez petite fraction de toutes les méthodes statiques, cependant.)

1368
not-just-yeti

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

  1. Si vous écrivez des classes d’utilitaires 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 d'instance.
  4. Si un code peut facilement être partagé par toutes les méthodes d'instance, extrayez-le dans une méthode statique.
  5. Si vous êtes sûr que la définition de la méthode ne sera jamais modifiée ni remplacée. Comme les méthodes statiques ne peuvent pas être remplacées.
509
Mohd

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 voulez pas instancier un objet supplémentaire à cette fin, placez-le dans une méthode statique. La JVM peut également beaucoup optimiser les méthodes statiques (je pense avoir déjà lu James Gosling déclarant que vous n’avez pas besoin d’instructions personnalisées dans la JVM, car les méthodes statiques seront tout aussi rapides, mais n’ont pas pu trouver la source. ça pourrait être complètement faux). Oui, il s’agit d’une micro-optimisation, et probablement inutile. Et nous, programmeurs, ne faisons jamais des choses inutiles simplement parce qu'elles sont cool, non?

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

  • Ajout de méthodes : vous vouliez vraiment que la classe String ait une méthode d'instance removeSpecialChars(), mais elle n'est pas là (et cela ne devrait pas l'être, car les caractères spéciaux de votre projet peut être différent de celui de l'autre projet), et vous ne pouvez pas l'ajouter (puisque Java est quelque peu sain), vous créez donc une classe utilitaire et appelez removeSpecialChars(s) au lieu de s.removeSpecialChars(). Sucré.

  • Pureté : en prenant certaines précautions, votre méthode statique sera un fonction pure , c’est-à-dire que la seule chose dont elle dépend est ses paramètres. Données en entrée, données en sortie. Ceci est plus facile à lire et à déboguer, car vous n'avez pas à vous soucier des particularités d'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, en surchargeant les méthodes, 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-y à deux fois.

Maintenant, plus important encore, pourquoi vous ne voudriez 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) . Cela prend beaucoup de flexibilité de votre conception. En outre, si vous avez besoin de state , vous vous retrouverez avec beaucoup de bugs de simultanéité et/ou des goulots d'étranglement si vous ne faites pas attention.

165
tetsuo

Après avoir lu les articles de Misko, je pense que méthodes statiques sont mauvaises du point de vue des tests. Vous devriez plutôt avoir sines (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

je n'ai qu'un problème Le problème de "comment puis-je m'assurer de n'en avoir qu'un" est bien évité. Vous instanciez seulement une seule ApplicationFactory dans votre main et par conséquent, vous instanciez une seule instance de tous vos singletons.

Le problème de base des méthodes statiques est qu’il s’agit d’un code de procédure.

Le problème de base des méthodes statiques est qu’il s’agit d’un code de procédure. Je ne sais pas comment tester un code de procédure. Les tests unitaires supposent que je puisse instancier une partie de mon application de manière isolée. Pendant l'instanciation, je couds les dépendances avec des faux/alliés qui remplacent les dépendances réelles. Avec la programmation procédurale, il n'y a rien à "câbler" puisqu'il n'y a pas d'objets, le code et les données sont séparés.

40
Alfred

Une méthode static est un type de méthode qui n'a besoin d'aucun objet à initialiser pour pouvoir être appelé. Avez-vous remarqué que static est utilisé dans la fonction main en Java? L'exécution du programme commence à partir de là sans création d'objet.

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.");
     }
  }
32
Zishan

Les méthodes statiques dans Java appartiennent à la classe (et non à une instance de celle-ci). Ils n'utilisent aucune variable d'instance et prennent généralement les entrées des paramètres, y effectuent des actions, puis renvoient des résultats. Les méthodes d'instances sont associées à des objets et, comme leur nom l'indique, peuvent utiliser des variables d'instance.

18
Kevin Sylvestre

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.

11
duffymo

Si vous appliquez un mot clé statique avec une 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 qu'il soit nécessaire de créer une instance d'une classe.
  3. la méthode statique peut accéder à un membre de données statique et en changer la valeur.
  4. Une méthode statique est accessible simplement en utilisant le nom d'un nom statique de classe. . . exemple: Student9.change ();
  5. Si vous souhaitez utiliser des champs non statiques d'une classe, vous devez utiliser une méthode non statique.

// 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 Indien BBDIT 222 Américain BBDIT 333 Chine BBDIT

11

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

Vous utiliseriez une méthode statique si la méthode n'utilise aucun champ (ou uniquement 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.

8
Carsten

Les méthodes statiques doivent être appelées sur la classe, les méthodes d'instance 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 pouvez uniquement Accélérer une voiture, si la voiture existe réellement (a été construite) et qu'il s'agirait donc d'une méthode d'instance.

Une classe de voiture peut également avoir une méthode de comptage appelée GetCarCount (). Cela renverrait le nombre total de voitures créées (ou construites). Si aucune voiture n’a été construite, cette méthode renverrait 0, mais elle devrait toujours pouvoir être appelée et, par conséquent, elle devra être une méthode statique.

7
Charlie Seligman

En fait, nous utilisons des propriétés et des méthodes statiques dans une classe, lorsque nous voulons utiliser une partie de notre programme, elle devrait exister jusqu’à ce que notre programme soit exécuté. Et nous savons que, pour manipuler des 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 des propriétés statiques prend du temps.

6
Sagar

Utilisez une méthode statique lorsque vous souhaitez pouvoir accéder à la méthode sans instance de la classe.

5
Jamey

Les méthodes statiques n'ont pas besoin d'être invoquées sur l'objet et c'est à ce moment-là que vous l'utilisez. Exemple: votre Main () est statique et vous ne créez pas d'objet pour l'appeler.

4
Vaishak Suresh

Les méthodes statiques et les variables sont des versions contrôlées de fonctions et de variables globales en Java. Dans quelles méthodes peuvent être accédées en tant que classname.methodName() ou classInstanceName.methodName(), c'est-à-dire qu'il est possible d'accéder aux méthodes statiques et aux variables à l'aide du nom de la classe ainsi que des instances de la classe.

La classe ne peut pas être déclarée statique (car cela n’a aucun sens. Si une classe est déclarée publique, elle est accessible de n’importe où) - les classes internes peuvent être déclarées statiques.

4
Manju Yadav

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

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

    Comme mentionné dans quelques réponses ci-dessus dans cet article, convertir des kilomètres en kilomètres ou calculer la température de Fahrenheit à Celsius et vice-versa. Avec ces exemples utilisant la méthode statique, il n'est pas nécessaire d'instancier un nouvel objet dans la mémoire de tas. Considérez 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 invoquée, Performance, Practical . Les exemples suivants sont Math et la classe StringUtils de la bibliothèque Apache-Commons:

    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 explicitement passées et obtiennent les données de résultat comme valeur de retour. Héritage, l'instanciation d'objet n'entre pas en image. Concis, lisible .

NOTE: Peu de gens contestent la testabilité des méthodes statiques, mais les méthodes statiques peuvent aussi être testées! 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
Anamika

Statique: Obj.someMethod

Utilisez static lorsque vous souhaitez fournir un accès au niveau de la classe à une méthode, c’est-à-dire lorsque la méthode doit être appelable sans instance de la classe.

3
Finbarr

Les méthodes statiques sont les méthodes de Java pouvant être appelées sans créer d'objet de classe. C'est appartenir à la classe.

Nous utilisons une méthode statique lorsque nous n'avons pas besoin d'être invoquée à l'aide d'instance.

3
rashedcs

Une méthode statique a deux objectifs principaux:

  1. Pour les méthodes utilitaires ou utilitaires ne nécessitant aucun état d'objet. Comme il n'est pas nécessaire d'accéder aux variables d'instance, l'utilisation de méthodes statiques élimine le besoin pour l'appelant d'instancier l'objet juste pour appeler la méthode.
  2. Pour l'état partagé par toutes les instances de la classe, comme un compteur. Toutes les instances doivent partager le même état. Les méthodes qui utilisent simplement cet état devraient également être statiques.
2
hemanto

Je me demande quand utiliser des méthodes statiques?

  1. Une utilisation courante des méthodes static consiste à accéder aux champs static.
  2. Mais vous pouvez avoir les méthodes static, sans référencer les variables static. Des méthodes d'assistance sans faire référence à la variable static peuvent être trouvées dans certaines classes Java telles que Java.lang.Math

    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 l'implémentation du verrouillage de niveau classe dans un environnement multi-thread.

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

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

La documentation Oracle page fournit plus de détails.

Toutes les combinaisons de variables d'instance et de classe et de méthodes 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éder directement aux variables de classe et aux méthodes de classe.
  3. Les méthodes de classe peuvent accéder directement aux variables de classe et aux méthodes de classe.
  4. Les méthodes de classe 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. De plus, les méthodes de classe ne peuvent pas utiliser le mot-clé this car il n'y a pas d'instance à laquelle se référer.
2
Ravindra babu

Dans Eclipse, vous pouvez activer un avertissement vous permettant de détecter les méthodes statiques potentielles. (Au-dessus de la ligne en surbrillance est un autre que j'ai oublié de mettre en évidence)

Eclipse setting

1
ave4496

Quand les méthodes statiques peuvent être bonnes?

Il n'y a que deux situations où des méthodes statiques ou des variables sont utilisées et ce n'est pas une abomination.

  1. Déclarer une vraie constante globale, pas une variable globale. Une constante globale. Exemple: Math.PI. Ceci est un raccourci pour vraiment dire qu'il existe un exemple de l'univers et que cet univers singleton contient un concept mathématique singleton dans lequel il existe une propriété PI qui ne change pas. Ce concept nous semble étrange car nous sommes habitués à ne pas penser à PI dans le contexte de la responsabilité orientée objet. Cela deviendrait plus évident si nous concevions un jeu étrange où il y avait des univers alternatifs avec différents concepts et constantes mathématiques.
  2. Création d'objet. Les méthodes statiques sont une méthode valable et valable de création d'objet. Les constructeurs surchargés qui prennent des arguments différents ne sont pas très clairs et le sont souvent en les remplaçant par un constructeur statique.

Quand les méthodes statiques sont mauvaises?

  1. Une façon de penser aux méthodes statiques est d'utiliser des procédures globales. Essentiellement, une méthode statique peut être appelée n'importe où. Il prétend simplement faire partie d'une classe, alors qu'en réalité cette classe n'est utilisée que comme une "balise", qui organise la méthode par une division logique. Je considère les méthodes statiques en ces termes, car la création de procédures globales est exactement le contraire de la conception orientée objet.

  2. Un autre problème majeur avec les méthodes statiques est la testabilité. La testabilité est un gros problème lors de la construction d'un logiciel. Les méthodes statiques sont notoirement difficiles à tester, notamment lorsqu'elles créent de nouvelles instances de classes concrètes. Si vous avez déjà travaillé avec du code existant et essayé d’écrire un test unitaire pour une méthode statique, vous connaissez ma douleur.

  3. Les méthodes statiques ne sont pas polymorphes non plus. Si vous créez une méthode statique sur une classe, il n'y a pas de remplacement de ce comportement. Vous êtes coincé avec une référence codée en dur à cette implémentation.

derniers mots

Alors, rappelez-vous que lorsque vous créez une méthode statique, réfléchissez-y soigneusement. Je ne préconise pas de ne jamais les utiliser. Je préconise d'avoir une très bonne raison et de vérifier d'abord si la méthode statique appartient vraiment à une autre classe où elle peut utiliser des informations d'état.

0
Tell Me How