Une règle d'or: demandez-vous "Est-il judicieux d'appeler cette méthode, même si aucun objet n'a encore été construit?" Si tel est le cas, il devrait certainement être statique.
Donc, dans une classe, Car
vous pourriez avoir une méthode:
double convertMpgToKpl(double mpg)
... qui serait statique, car on pourrait vouloir savoir à quoi convertit 35mpg, même si personne n'a jamais construit de fichier Car
. Mais cette méthode (qui définit l'efficacité d'un particulier Car
):
void setMileage(double mpg)
... ne peut pas être statique car il est inconcevable d'appeler la méthode avant d'en Car
avoir construit une.
(Soit dit en passant, l'inverse n'est pas toujours vrai: vous pouvez parfois avoir une méthode qui implique deux Car
objets, et toujours vouloir qu'elle soit 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é" qui Car
est plus important, vous ne devriez pas forcer un appelant à en choisir un Car
comme objet que vous invoquerez le méthode activée. Cette situation représente cependant une fraction assez faible de toutes les méthodes statiques.)
Car#isMoreEfficientThan(Car)
. Il a l'avantage que la voiture que vous retournez en égalité n'est pas arbitraire. Il est évident par le titre de la méthode ce qui est retourné en cas d'égalité.Définissez les méthodes statiques uniquement dans les scénarios suivants:
la source
Il existe des raisons valables d'utiliser des méthodes statiques:
Performances : si vous voulez que du code soit exécuté et que vous ne voulez pas instancier un objet supplémentaire pour le faire, insérez-le dans une méthode statique. La JVM peut également optimiser beaucoup les méthodes statiques (je pense avoir lu James Gosling une fois 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 trouveront pas 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'elles sont cool, non?
Pratique : au lieu d'appeler
new Util().method(arg)
, d'appelerUtil.method(arg)
oumethod(arg)
avec des importations statiques. Plus facile, plus court.Ajout de méthodes : vous vouliez vraiment que la classe String ait une
removeSpecialChars()
méthode d'instance, mais elle n'est pas là (et elle ne devrait pas, car les caractères spéciaux de votre projet peuvent être différents des autres projets), et vous ne pouvez pas l'ajouter (depuis Java est un peu sain d'esprit), vous créez donc une classe utilitaire et appelez à laremoveSpecialChars(s)
place des.removeSpecialChars()
. Doux.Pureté : en prenant quelques précautions, votre méthode statique sera une fonction pure , c'est-à-dire que la seule chose dont elle dépend est ses paramètres. Données entrantes, données sortantes. C'est plus facile à lire et à déboguer, car vous n'avez pas à vous soucier des bizarreries d'héritage. 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 n'autorisant pas les références aux attributs d'instance, en remplaçant les méthodes, etc.).
Vous devrez également créer une méthode statique si vous voulez faire un singleton, mais ... ne le faites pas. Je veux dire, réfléchissez-y à deux fois.
Maintenant, plus important encore, pourquoi ne voudriez-vous pas créer une méthode statique? Fondamentalement, le polymorphisme sort par 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 de nombreux bugs et / ou goulots d'étranglement en cas de non-prudence.la source
Après avoir lu les articles de Misko, je pense que les méthodes statiques sont mauvaises du point de vue des tests. Vous devriez avoir des usines à la place (peut-être en utilisant un outil d'injection de dépendances comme Guice ).
comment puis-je m'assurer que je n'ai qu'une chose
Le problème de base avec les méthodes statiques est qu'elles sont du code procédural
la source
Math.abs()
ouArrays.sort()
, même des méthodes dans lesquelles vous pouvez passer toutes les dépendances , je ne vois pas comment cela pourrait empêcher le test unitaire. Je dirais qu'une règle empirique simple est la suivante: si vous avez une raison de vous moquer de la logique procédurale, ne la mettez pas dans une méthode statique. Je n'ai jamais eu de raison de me moquerArrays.sort()
ouMath.abs()
.Une
static
méthode est un type de méthode qui n'a besoin d'aucun objet à initialiser pour être appelée. Avez-vous remarqué qu'ilstatic
est utilisé dans lamain
fonction Java? L'exécution du programme commence à partir de là sans qu'un objet soit créé.Prenons l'exemple suivant:
la source
Les méthodes statiques en java appartiennent à la classe (et non à une instance de celle-ci). Ils n'utilisent aucune variable d'instance et prennent généralement les données des paramètres, effectuent des actions dessus, puis renvoient un résultat. Les méthodes d'instances sont associées aux objets et, comme leur nom l'indique, peuvent utiliser des variables d'instance.
la source
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.
la source
Si vous appliquez un mot clé statique avec n'importe quelle méthode, il est appelé méthode statique.
// Programme de modification de la propriété commune de tous les objets (champ statique).
O / P: 111 Indien BBDIT 222 Américain BBDIT 333 Chine BBDIT
la source
Les méthodes statiques ne sont pas associées à une instance, elles ne peuvent donc pas accéder aux champs non statiques de 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.
la source
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 que si la voiture existe réellement (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 retournerait 0, mais elle devrait toujours pouvoir être appelée, et donc il faudrait que ce soit une méthode statique.
la source
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 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, la manipulation des propriétés statiques prend du temps.
la source
Utilisez une méthode statique lorsque vous souhaitez pouvoir accéder à la méthode sans instance de la classe.
la source
Statique:
Obj.someMethod
À utiliser
static
lorsque vous souhaitez fournir un accès de niveau classe à une méthode, c'est-à-dire où la méthode doit être appelable sans instance de la classe.la source
Les méthodes statiques n'ont pas besoin d'être invoquées sur l'objet et c'est à ce moment que vous l'utilisez. Exemple: votre Main () est un objet statique et vous ne créez pas d'objet pour l'appeler.
la source
Les méthodes et variables statiques sont une version contrôlée des fonctions et variables «globales» en Java. Dans quelles méthodes sont accessibles en tant que
classname.methodName()
ouclassInstanceName.methodName()
, c'est-à-dire que les méthodes et variables statiques sont accessibles en utilisant le nom de classe ainsi que les 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, elle est accessible de n'importe où), les classes internes peuvent être déclarées statiques.
la source
Des méthodes statiques peuvent être utilisées si
On ne veut pas effectuer une action sur une instance (méthodes utilitaires)
On veut utiliser comme une fonction simple. Les entrées sont explicitement transmises et obtiennent les données de résultat comme valeur de retour. L'hérédité, l'instanciation d'objet n'entre pas en scène. Concis, lisible .
REMARQUE : Peu de gens s'opposent à la testabilité des méthodes statiques, mais les méthodes statiques peuvent également être testées! Avec jMockit, on peut se moquer des méthodes statiques. Testabilité . Exemple ci-dessous:
la source
Les méthodes statiques sont les méthodes en Java qui peuvent être appelées sans créer un objet de classe. Il appartient à la classe.
Nous utilisons une méthode statique lorsque nous n'avons pas besoin d'être invoquée en utilisant une instance.
la source
static
méthodes consiste à accéder auxstatic
champs.Mais vous pouvez avoir des
static
méthodes, sans référencer destatic
variables. Des méthodes d'assistance sansstatic
variable de référence peuvent être trouvées dans certaines classes java comme java.lang.MathL'autre cas d'utilisation, je peux penser à ces méthodes combinées avec la
synchronized
méthode est l'implémentation du verrouillage au niveau de la classe dans un environnement multi-thread.Si vous devez accéder à la méthode sur un objet instance de la classe, votre méthode doit ê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:
la source
A common use for static methods is to access static fields.
n'est pas un argument.Une méthode statique a deux objectifs principaux:
la source
Dans eclipse, vous pouvez activer un avertissement qui vous aide à détecter les méthodes statiques potentielles. (Au-dessus de la ligne en surbrillance, j'en ai oublié une autre)
la source
Chaque fois que vous ne souhaitez pas créer un objet pour appeler une méthode dans votre code, déclarez simplement cette méthode comme statique. Étant donné que la méthode statique n'a pas besoin d'une instance pour être appelée avec mais le catch ici n'est pas toutes les méthodes statiques sont appelées par JVM automatiquement. Ce privilège n'est utilisé que par la méthode main () "public static void main [String ... args]" en java car au Runtime, c'est la méthode Signature public "static" void main [] recherchée par la JVM comme point d'entrée pour démarrer l'exécution du code.
Exemple:
Sortie: - Cette méthode statique est exécutée par JVM Cette méthode statique doit être appelée explicitement Cette méthode statique doit être appelée explicitement Cette méthode statique doit être appelée explicitement
la source