Champs statiques

images/whitebelt.png

Si on définissait une valeur constante comme ceci :

public class Versement {
   final int NB_DECIMALES = 2 ;
   final double montant ;
   final String monnaie ;
   final long heureOperation = System.currentTimeMillis();
   // autres codes
}

Alors on créerait pour chaque objet une valeur NB_DECIMALES alors que c’est toujours la même valeur! Dans ce cas on crée une "variable partagée" (ou "variable de classe").

définition d’une constante partagée. 

public class Versement {
   public static final int NB_DECIMALES = 2 ;
   final double montant ;
   // autres codes ....

Utilisation d’une constante partagée. 

   double res = rayon * Math.PI ;

[Note]

Les variables partagées ne sont pas nécessairement des constantes (marquées final). Un exemple de variable partagée déjà connue: System.out

[Avertissement]Attention!

Les constantes partagées donnent lieu à des comportements divers du compilateur. Il y a des données qui sont initialisées au compile time (le compilateur connait leur valeur et la recopie dans le code binaire) et d’autres au load time (la valeur n’est connue qu’au moment où la classe est chargée en mémoire par le ClassLoader).

  • Pour une variable scalaire initialisée au compile time le compilateur recopiera la valeur correspondante dans tous les codes appelants; c’est une optimisation qui risque de poser problème: si le code de définition change la valeur il faudra recompiler tous les codes appelants!
  • Les initialisations de load time posent des problèmes particuliers lorsqu’il y a plusieurs ClassLoader : il s’agit d’un aspect très avancé sur lequel nous ne étendrons pas à ce niveau.

--exercices--