web-dev-qa-db-fra.com

Comment et où utiliser le modificateur statique en Java?

Comment et où devrions-nous utiliser un modificateur statique pour:

1. Champ et
2. Méthode?

Pour exemple dans la classe Java.lang.Math, les méthodes de champs telles que abs (), atan (), cos (), etc. sont statiques, c’est-à-dire qu’elles sont accessibles comme suit: Math.abs()

Mais pourquoi est-ce une bonne pratique?

Dis, je ne le garde pas statique, je crée un objet de la classe et j'y accède, ce que je peux de toute façon. Je vais simplement vous avertir que vous essayez d'accéder à une méthode statique de manière non statique (comme indiqué @duffymo, pas en cas de cours de mathématiques).

UPDATE 1:

Ainsi, la méthode d’utilité devrait être statique, c’est-à-dire dont le travail dépend uniquement des paramètres de la méthode. Ainsi, par exemple, la méthode updateString(String inputQuery, String highlightDoc) aurait-elle dû être une méthode statique dans cette question ?

12
zengr

Vous pouvez imaginer une méthode ou un champ 'statique' comme s'il avait été déclaré en dehors de la définition de la classe. En d'autres termes

  1. Il n'y a qu'une seule "copie" d'un champ/méthode statique.
  2. Les champs/méthodes statiques ne peuvent pas accéder aux champs/méthodes non statiques.

Il y a plusieurs cas où vous voudriez faire quelque chose de statique.

L'exemple canonique pour un champ consiste à créer un champ entier statique qui conserve un compte dans toutes les occurrences (objets) d'une classe. En outre, les objets singleton, par exemple, utilisent également généralement le modificateur static.

De même, les méthodes statiques peuvent être utilisées pour effectuer des travaux 'utilitaires' pour lesquels toutes les dépendances requises sont transmises en tant que paramètres à la méthode. Vous ne pouvez pas référencer le mot clé 'this' à l'intérieur d'une méthode statique.

En C #, vous pouvez également avoir des classes statiques qui, comme vous pouvez le deviner, ne contiennent que des membres statiques:

public static class MyContainer
{
    private static int _myStatic;

    public static void PrintMe(string someString)
    {
        Console.Out.WriteLine(someString);
        _myStatic++;
    }

    public static int PrintedInstances()
    {
        return _myStatic;
    }
}
20
Alex

Static utilise moins de mémoire puisqu'il n'existe qu'une seule fois par Classloader. 

Avoir des méthodes statiques peut vous faire gagner du temps, car vous n’avez pas besoin de créer d’abord un objet pour pouvoir appeler une fonction. Vous pouvez/devriez utiliser des méthodes statiques quand elles se débrouillent assez bien (c'est-à-dire Math.abs (X) - il n'y a vraiment aucun objet dont la fonction a besoin.) C'est fondamentalement une chose pratique (au moins autant que je le vois - d'autres pourraient et seront en désaccord: P)

Les champs statiques doivent être utilisés avec prudence. Il existe de nombreux modèles qui nécessitent des champs statiques ... mais les bases en premier:

un champ statique n'existe qu'une fois. Donc, si vous avez une classe simple (un peu pseudocode):

class Simple {
 static int a;
 int b;
}

et maintenant vous faites des objets avec:

Simple myA = new Simple();
Simple myB = new Simple();
myA.a = 1;
myA.b = 2;
myB.a = 3;
myB.b = 4;
System.out.println(myA.a + myA.b + myB.a + myB.b);

vous obtiendrez 3234 - car en définissant myB.a, vous écraserez également myA.a car a est statique. Il existe en un seul endroit dans la mémoire.

Vous voulez normalement éviter cela parce que des choses vraiment étranges peuvent arriver. Mais si vous google par exemple pour Factory Pattern vous verrez qu'il existe des utilisations très utiles pour ce comportement.

J'espère que ça clarifie un peu.

8
Niko

Essayez de jeter un coup d'œil à ce billet, il donne également des exemples de quand et quand ne pas utiliser les modificateurs statiques et finaux.

La plupart des articles ci-dessus sont similaires, mais cet article pourrait offrir d'autres idées. 
Quand utiliser les modificateurs statiques

2
TheJediCowboy

Généralement, lorsque la méthode dépend uniquement des paramètres de la fonction et non de l'état interne de l'objet, il s'agit d'une méthode statique (la seule exception étant singletone). Je ne peux pas imaginer où les champs statiques sont réellement utilisés (ce sont les mêmes que les variables globales qu'il convient d'éviter).
Comme dans votre exemple, les fonctions mathématiques ne dépendent que des paramètres.

1
Fge

Pour un champ, gardez-le statique si vous voulez que toutes les instances d'une classe donnée aient accès à sa valeur. Par exemple si j'ai 

public static int age = 25;

Ensuite, n'importe quelle instance de la classe peut obtenir ou définir la valeur de l'âge en pointant toutes sur la même valeur. Si vous faites quelque chose de statique, vous courez le risque d'avoir deux instances écrasant les valeurs les unes des autres et pouvant causer des problèmes.

La raison pour créer des méthodes statiques est principalement pour la fonction d'utilité où toutes les données requises pour la méthode sont transmises et vous ne voulez pas prendre le dessus de créer une instance de la classe chaque fois que vous voulez appeler la méthode.

1
pilotgallo2

Vous ne pouvez pas instancier une instance de Java.lang.Math; il n'y a pas de constructeur public.

Essayez le:

public class MathTest
{
    public static void main(String [] args)
    {
        Math math = new Math();

        System.out.println("math.sqrt(2) = " + math.sqrt(2));
    }
}

Voici ce que vous obtiendrez:

C:\Documents and Settings\Michael\My Documents\MathTest.Java:5: Math() has private access in Java.lang.Math
        Math math = new Math();
                    ^
1 error

Tool completed with exit code 1
0
duffymo
class StaticModifier
{    

    {
        System.out.println("Within init block");//third
    }
    public StaticModifier()
    {
        System.out.println("Within Constructor");//fourth
    }
    public static void main(String arr[])
    {
    System.out.println("Within Main:");//second
    //StaticModifier obj=new StaticModifier();
    }
    static
    {
    System.out.print("Within static block");//first
    }
}
0
Bidyut Das