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 ne soient invocables que sur un object 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!

Une règle de base: demandez-vous “est-il judicieux d’appeler cette méthode, même si aucun Obj n’a encore été construit?” Si c’est le cas, cela devrait définitivement être statique.

Donc, dans une Car classe, vous pourriez avoir une méthode double convertMpgToKpl(double mpg) qui serait statique, car on pourrait vouloir savoir à quoi 35mpg se transforme, 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 ait été construite.

(Btw, l’inverse n’est pas toujours vrai: vous pouvez parfois avoir une méthode qui implique deux objects Car , et toujours vouloir qu’elle soit statique. Par exemple, Car theMoreEfficientOf( Car c1, Car c2 ) . Bien que cela puisse être converti en non – version statique, certains diront qu’il n’ya pas de choix “privilégié” de quelle voiture est la plus importante, vous ne devriez pas forcer un appelant à choisir une voiture comme object sur lequel vous allez appeler la méthode. pour une fraction relativement petite de toutes les méthodes statiques, cependant.)

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

  1. Si vous écrivez des classes utilitaires 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 existe un 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 certain 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.

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 object supplémentaire pour le faire, placez-le dans une méthode statique. La JVM peut également optimiser les méthodes statiques (je pense avoir lu une fois 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 ne pourront pas trouver la source – donc cela pourrait être complètement faux). Oui, c’est de la micro-optimisation, et probablement inutile. Et nous, les programmeurs, ne faisons jamais de choses inutiles simplement parce qu’ils sont cool, non?

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

  • Ajouter des méthodes : vous vouliez vraiment que la classe Ssortingng ait une méthode d’instance removeSpecialChars() , mais elle n’est pas là (et elle ne devrait pas l’être, car les caractères spéciaux de votre projet peuvent être différents des autres projets) et vous ne pouvez pas l’append (étant donné que Java est relativement sain), vous créez donc une classe d’utilitaire et appelez removeSpecialChars(s) au lieu de s.removeSpecialChars() . Doux.

  • Pureté : en prenant certaines précautions, votre méthode statique sera une fonction pure , c’est-à-dire que la seule chose dont elle dépend est ses parameters. Données dans, données sortantes. C’est plus facile à lire et à déboguer, car vous n’avez pas à vous soucier des bizarreries de l’inheritance. Vous pouvez aussi le faire avec les méthodes d’instance, mais le compilateur vous aidera un peu plus avec les méthodes statiques (en ne permettant pas les références aux atsortingbuts d’instance, aux méthodes de substitution, 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.

Plus important encore, pourquoi ne pas créer une méthode statique? Fondamentalement, le polymorphism sort de la fenêtre . Vous ne pourrez pas remplacer la méthode, ni la déclarer dans une interface (pré-Java 8) . Cela prend beaucoup de flexibilité de votre conception. De plus, si vous avez besoin d’un état , vous vous retrouverez avec beaucoup de bogues et / ou de goulots d’étranglement si vous ne faites pas attention.

Après avoir lu les articles de Misko, je pense que les méthodes statiques sont mauvaises du sharepoint vue des tests. Vous devriez avoir des usines à la place (peut-être en utilisant un outil d’dependency injection comme Guice ).

comment puis-je m’assurer que je n’ai qu’un des

Le problème de «comment puis-je m’assurer que je n’ai que quelque chose» est joliment évité. Vous instanciez une seule application ApplicationFactory dans votre main, et par conséquent, vous instanciez une seule instance de tous vos singletons.

Le problème fondamental avec les méthodes statiques est qu’elles sont du code procédural

Le problème fondamental des méthodes statiques est qu’elles sont du code procédural. Je ne sais pas comment tester le code de procédure. Les tests unitaires supposent que je peux instancier une partie de mon application de manière isolée. Au cours de l’instanciation, je connecte les dépendances avec des simulations / allumettes qui remplacent les dépendances réelles. Avec la programmation procédurale, il n’y a rien à “câbler” car il n’y a pas d’objects, le code et les données sont séparés.

Une méthode static est un type de méthode qui ne nécessite aucun object à initialiser pour ê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 qu’un object soit créé.

Prenons l’exemple suivant:

  class Languages { public static void main(Ssortingng[] args) { display(); } static void display() { System.out.println("Java is my favorite programming language."); } } 

Les méthodes statiques en Java appartiennent à la classe (pas une instance de celle-ci). Ils n’utilisent aucune variable d’instance et prennent généralement des données à partir des parameters, effectuent des actions dessus, puis renvoient des résultats. Les méthodes d’instances sont associées à des objects et, comme leur nom l’indique, peuvent utiliser des variables d’instance.

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.

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’à un object d’une classe.
  2. Une méthode statique appelée sans avoir besoin de créer une instance d’une classe.
  3. La méthode statique peut accéder à des données statiques et peut en modifier la valeur.

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

 class Student9{ int rollno; Ssortingng name; static Ssortingng college = "ITS"; static void change(){ college = "BBDIT"; } Student9(int r, Ssortingng n){ rollno = r; name = n; } void display (){System.out.println(rollno+" "+name+" "+college);} public static void main(Ssortingng 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 BBDIT indien 222 BBDIT américain 333 Chine BBDIT

Les méthodes statiques ne sont pas associées à une instance, elles ne peuvent donc 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.

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, cela devrait exister jusqu’à ce que notre programme soit en cours d’exécution. Et nous soaps 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 les méthodes statiques, manipuler les propriétés statiques prend du temps.

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

Les méthodes et les variables statiques sont une version contrôlée des fonctions et des variables ‘Global’ en Java. Dans lesquelles les méthodes sont accessibles sous la forme classname.methodName() ou classInstanceName.methodName() , c.-à-d. Que les méthodes et les variables statiques sont accessibles à l’aide du nom de la classe et des instances de la classe.

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

Statique: Obj.someMethod

Utilisez static lorsque vous voulez fournir un access au niveau de la classe à une méthode, c.-à-d. Où la méthode doit pouvoir être appelée sans instance de la classe.

Les méthodes statiques n’ont pas besoin d’être invoquées sur l’object et c’est quand vous l’utilisez. Exemple: votre main () est statique et vous ne créez pas d’object pour l’appeler.

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

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

    Comme mentionné dans quelques-unes des 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 une méthode statique, il n’est pas nécessaire d’instancier un nouvel object entier dans la mémoire du 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 sont la bibliothèque SsortingngUtils de Math et Apache-Commons class ci-dessous:

     Math.random() Math.sqrt(double) Math.min(int, int) SsortingngUtils.isEmpty(Ssortingng) SsortingngUtils.isBlank(Ssortingng) 
  • On veut utiliser une fonction simple. Les entrées sont explicitement passées et les résultats sont obtenus en tant que valeur de retour. Héritage, l’instanciation d’object n’entre pas en ligne de compte. Concis, lisible .

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

 new MockUp() { @Mock public int doSomething(Input input1, Input input2){ return returnValue; } }; 

Les méthodes statiques sont les méthodes en Java qui peuvent être appelées sans créer d’object de classe. Il appartient à la classe.

Nous utilisons la méthode statique lorsque nous n’avons pas besoin d’être invoqué par la méthode d’instance.

Dans éclipse, vous pouvez activer un avertissement qui vous aide à 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)

réglage de l'éclipse

Je me demande quand utiliser des méthodes statiques?

  1. Une utilisation courante static méthodes static consiste à accéder static champs static .
  2. Mais vous pouvez avoir static méthodes static , sans faire référence static variables static . Des méthodes d’assistance sans référence à static variable static peuvent être trouvées dans certaines classes Java comme 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 locking de niveau de 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 object instance de la classe. Est-ce que cela signifie que je devrais utiliser une méthode statique?

Si vous devez accéder à une méthode sur un object d'instance de la classe, votre méthode devrait être non statique.

La page de documentation Oracle fournit plus de détails.

Toutes les combinaisons de variables et 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é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'object. En outre, 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.

Les méthodes statiques sont partagées entre toutes les instances de la classe, les développeurs utilisent normalement des mots-clés statiques avec des méthodes utilitaires qui effectuent des fonctionnalités courantes régulièrement utilisées partout dans l’application.

Si les conditions suivantes s’appliquent, configurez votre méthode de manière statique:

  1. Votre méthode fait une fonctionnalité commune qui est régulièrement utilisée dans toute l’application.
  2. Votre méthode n’utilise pas de variables d’instance.
  3. Votre méthode accepte les entrées en tant qu’arguments, faites des fonctionnalités communes, puis renvoyez des résultats.

PS: Il convient de mentionner qu’il est très difficile, voire impossible, de se moquer d’une méthode statique, la moquerie étant un mécanisme utilisé dans les tests unitaires pour simuler l’activité de certaines méthodes.

Pour plus de détails, vérifiez: Mot-clé statique en Java

Une méthode statique a deux objectives principaux:

  1. Pour les méthodes utilitaires ou d’assistance qui ne nécessitent aucun état d’object. Comme il n’est pas nécessaire d’accéder aux variables d’instance, l’utilisation de méthodes statiques élimine la nécessité pour l’appelant d’instancier l’object uniquement pour appeler la méthode.
  2. Pour l’état qui est 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.

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 qu’accélérer une voiture, si la voiture existe (a été construite) et que ce serait donc une méthode d’instance.

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