web-dev-qa-db-fra.com

initialisation de variables statiques

Aujourd'hui, j'ai eu une discussion avec mon collègue et j'ai conclu les points suivants. Veuillez jeter un peu de lumière si tout est correct ou si une modification est nécessaire.

  1. Lorsque le constructeur statique n'est pas défini dans la classe, les champs statiques sont initialisés juste avant leur utilisation.
  2. Lorsque le constructeur statique est défini dans la classe, les champs statiques sont initialisés juste avant leur utilisation ou dans le cadre de la création d'instance (avant).
  3. Si aucun champ statique n'est accessible dans une méthode statique et que cette méthode statique est appelée. les champs statiques ne seront initialisés que si le constructeur statique est défini dans cette classe.
  4. Si possible, le constructeur statique doit être évité dans une classe.
29
Azodious

1.-3.Vous ne pouvez pas savoir exactement quand cela se produit et vous ne pouvez donc pas en dépendre. Un constructeur statique vous donnera un petit contrôle sur ce qui se passe quand il est appelé.

public class UtilityClass
{
  //
  // Resources
  //

  // r1 will be initialized by the static constructor
  static Resource1 r1 = null;

  // r2 will be initialized first, as static constructors are 
  // invoked after the static variables are initialized
  static Resource2 r2 = new Resource2();

  static UtilityClass()
  {
    r1 = new Resource1();
  }

  static void f1(){}
  static void f2(){}
}

4.Les constructeurs statiques sont lents

Le moment exact de l'exécution du constructeur statique dépend de l'implémentation, mais est soumis aux règles suivantes:

  • Le constructeur statique d'une classe s'exécute avant la création de toute instance de la classe.
  • Le constructeur statique d'une classe s'exécute avant qu'aucun des membres statiques de la classe ne soit
    référencé.
  • Le constructeur statique d'une classe s'exécute après les initialiseurs de champ statique (le cas échéant) de la classe.
  • Le constructeur statique d'une classe s'exécute au maximum une fois au cours d'une seule instanciation de programme.
  • L'ordre d'exécution entre deux constructeurs statiques de deux
    classes différentes n'est pas spécifiée.
10
sra

Tous vos points sont corrects.

La raison pour laquelle les constructeurs statiques doivent être évités est que le compilateur injecte du code partout où n'importe quelle méthode de la classe est appelée pour vérifier que le constructeur statique a été appelé. Cela a un impact négatif sur les performances.

Ce que vous pouvez faire, c'est avoir un champ statique privé dans votre classe auquel est affectée une valeur fictive lorsque le constructeur par défaut (ou un autre constructeur non statique) est appelé. Cela initialise tous les champs statiques lors de la création d'objet.

4
jaywayco