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 de N 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 classe Constant ... 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 ...