12
votes

Comment et où utiliser un modificateur statique en Java?

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

1. Champ et
2. Méthode?

pour exemple dans java.lang.math classe, les champs tels que ABS (), ATAN (), COS (), COS (), sont statiques, c'est-à-dire qu'ils sont accessibles comme suit: math.abs ()

Mais pourquoi est-ce une bonne pratique?

Dites, je ne le garde pas statique et crée un objet de la classe et y accédez, ce qui, de toute façon, je peux, je vais simplement obtenir un avertissement que, vous essayez d'accéder à une méthode statique de manière non statique ( Comme indiqué par @duffymo, pas en cas de classe de mathématiques).

Mise à jour 1:

Ainsi, la méthode utilitaire doit être statique, c'est-à-dire dont le travail dépend uniquement des paramètres de la méthode. Donc, par exemple, la méthode upmateString (String Inputquery, String HighToc) aurait dû être une méthode statique dans Cette question ?


0 commentaires

7 Réponses :


22
votes

Vous pouvez penser à une méthode ou à un champ statique 'comme s'il était déclaré externe 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. Li>
  2. Les champs statiques / méthodes ne peuvent pas accéder à des champs / méthodes non statiques. LI> ol>

    Il y a plusieurs instances où vous voudriez faire quelque chose de statique. p>

    L'exemple canonique d'un champ est de créer un champ d'entier statique qui conserve un compte dans toutes les instances (objets) d'une classe. De plus, des objets Singleton, par exemple, utilisent également le modificateur statique. P>

    De même, des 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é à l'intérieur d'une méthode statique. p>

    en C #, vous pouvez également avoir des classes statiques qui, comme vous pourriez deviner, contiennent uniquement des membres statiques: P>

    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;
        }
    }
    


2 commentaires

S'il vous plaît vérifier ma mise à jour. Pouvez-vous donner des informations sur l'exemple méthode que j'ai postée dans ma question. Qui est aussi une méthode utilitaire.


@ZENGR: Oui, je ferais cette méthode statique. Vous pouvez imaginer, par exemple une classe StressHelper qui entoure toutes vos opérations de manipulation de chaîne spécifiques à une application (telles que celle effectuée par cette méthode). En fait, je ferais toute méthode statique si elle ne fait pas référence au mot-clé "Ceci"; Il n'est pas nécessaire de créer une copie de cette méthode sur chaque objet, il est plus lisible de cette façon, et il est bon de clarté de la conception globale de l'OMI.



1
votes

Habituellement, lorsque la méthode dépend uniquement des paramètres de fonction et non de l'état interne de l'objet, c'est une méthode statique (avec singletone étant la seule exception). Je ne peux pas imaginer où des champs statiques sont vraiment utilisés (ils sont identiques aux variables globales qui devraient être évitées).
Comme dans votre exemple, les fonctions mathématiques ne dépendent que des paramètres.


6 commentaires

Il existe des utilisations parfaitement légitimes pour le modificateur statique, tel que ceux énumérés dans ma réponse.


"Ils sont les mêmes que les variables globales qui devraient être évitées" - pas si elles sont finales; ceux qui apparaissent souvent comme des constantes de classe.


@alex je n'ai pas pensé à cela. Je suppose que l'utilisation de champs statiques dépend principalement de votre mode de programmation et il y a probablement des situations parfaitement fines quand les utiliser (et qui ne sont en aucune façon singletone). Ce n'est pas encore parce que je ne les ai pas encore vus dire qu'ils existent ou sont mauvais :) Pour mon propre intérêt, pourriez-vous m'expliquer pourquoi vous voudriez connaître le nombre total d'instances d'un objet, mais aucune référence à cela?


Bien sûr, disons que j'ai un jeu où je crée des monstres / des créatures. Je voudrais garder un couple simple de combien de créatures que j'ai créées au cours de la vie du jeu. IMO La mise en œuvre la plus simple est une variable de comptoir statique à l'intérieur de la classe Monster.


@jason comme vous dites que ce sont des constantes qui ne peuvent pas être modifiées par votre programme. En pensant aux domaines statiques publics, je pense à la statique, chaque partie de votre code peut modifier. Sinon, je les ferais parlé de constantes (les champs statiques privés ont à nouveau leur légitime étant aussi bien sûr).


@alex merci :) Je n'y ai pas pensé. Plutôt plus pensé aux domaines statiques publics (comme les exemples donnés étaient publics). Peut-être que j'étais un peu trop rapide avec cette déclaration et je devrais ajouter ceci (seulement) s'applique aux champs statiques publics.



0
votes

Vous ne pouvez pas instancier une instance de java.lang.math; Il n'y a pas de constructeur public.

Essayez-le: P>

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


2 commentaires

Oups, je l'ai manqué. Mais en général, si une méthode est statique, nous pouvons toute façon l'accéder à un objet. Donc, d'où vient l'efficacité de la mémoire en utilisant static?


Ce n'est pas une question d'efficacité de la mémoire; C'est à propos de l'intention du concepteur de classe.



1
votes

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

public static int age = 25;


0 commentaires

8
votes

statique utilise moins de mémoire car il n'existe qu'une fois par chargeur de classe.

Pour que les méthodes statiques puissent économiser un peu de temps, Beacuse Vous n'avez pas besoin de créer d'abord un objet afin que vous puissiez appeler une fonction. Vous pouvez / devrait utiliser des méthodes statiques quand elles se tiennent à peu près elles-mêmes (c'est-à-dire. MATH.ABS (X) - il n'y a vraiment pas d'objet les besoins de la fonction.) Fondamentalement, c'est une chose de commodité (au moins aussi loin que je le vois - D'autres pourraient et seront en désaccord: p)

Les champs statiques doivent vraiment être utilisés avec prudence. Il y a plusieurs modèles qui ont besoin de champs statiques ... mais les bases d'abord:

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

et maintenant vous faites des objets avec: xxx

vous obtiendra 3234 - parce que, en définissant la myb.a, vous écrasez également MyA.A aussi bien parce que A est statique. Il existe dans un endroit en mémoire.

Vous voulez normalement éviter cela parce que des choses vraiment étranges pourraient se produire. Mais si vous google, par exemple pour modèle d'usine , vous verrez qu'il existe des utilisations assez utiles pour ce comportement.

espère que cela l'effraie un peu. < / p>


1 commentaires

Les champs statiques existent une fois par chargeur de classe, pas une fois par JVM.



2
votes

Essayez de regarder cet article, cela donne également des exemples de quand et quand de ne pas utiliser de modificateurs statiques et finaux.

La plupart des postes ci-dessus sont similaires, mais ce poste pourrait offrir une autre perspicacité. Quand utiliser des modificateurs statiques


0 commentaires

0
votes
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 commentaires