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!
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.)
Définissez des méthodes statiques dans les scénarios suivants uniquement:
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.
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 ).
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. 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.
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.");
}
}
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.
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 une méthode, il s'agit d'une méthode 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
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.
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.
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.
Utilisez une méthode statique lorsque vous souhaitez pouvoir accéder à la méthode sans instance de la classe.
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.
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.
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;
}
};
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.
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.
Une méthode statique a deux objectifs principaux:
Je me demande quand utiliser des méthodes statiques?
static
consiste à accéder aux champs static
.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;
}
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:
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.
Quand les méthodes statiques sont mauvaises?
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.
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.
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.