Utilisation de constantes en Java
Lorsque je veux utiliser plusieurs fois la même valeur dans un code, plutôt que d'écrire à chaque fois sa valeur littérale (exemple, 42), je déclare une constante (exemple, N
) à laquelle j'associe la valeur qui m'intéresse.
Partout dans le code, une occurrence de N
sera remplacée par 42.
public static final int N = 42;
Lorsque l'on utilise une constante dans une classe, que fait le compilateur[1] lorsqu'il génère le bytecode ? Comment "remplace-t-il" toutes les occurences de N par 42 ?
Cette question provient du fait que la syntaxe permettant l'écriture d'une constante en java est la même, au mot clé final
près que pour l'écriture d'une variable ... alors ...
N
est définie comme étant une variable constante. Comme telle, je peux y faire appel (un appel au runtime) dans mon code et obtenir sa valeur mais je ne peux pas la modifier. Chaque occurence deN
dans mon code mettra en œuvre le mécanisme de consultation d'une variable.N
représente une constante, je sais (et mon compilateur aussi) que cette valeur sera la même pendant toute l'exécution du code. Je ne dois donc pas consulter sa valeur à chaque fois que je la rencontre. Je peux donc remplacer cette variable par sa valeur lorsque je (le compilateur) génère le bytecode.
C'est ce deuxième choix qui est fait par le compilateur.
Soient les deux codes suivants
public class Constant { public static final int N = 42; }
public class Use { public static void main ( String[] args ) { System.out.println("Constante: " + Constant.N); } }
Essayez la manip suivante
- Compilez les deux codes et lancez la classe
Use
... 42 s'affiche s/42/43
et recompilez uniquement la classeConstant
... 42 s'affiche toujours- Recompilez la classe
Use
maintenant et vous verrez apparaitre 43. C'est donc bien le compilateur qui fait le travail ...
Ceci n'est vrai que dans le cas d'une constante de classe et non dans le cas d'une constante d'instance. C'est-à-dire que la même manip en omettant le mot clé static
ne fournira pas le mêm résultat.
À lire aussi
Notes
[1] En me relisant, je me dis que demander ce que fait le compilateur, c'est un peu induire la réponse ...