Nous devons distinguer deux aspects des constantes:
- les noms de valeurs connues au moment du développement, que nous introduisons pour une meilleure maintenabilité, et
- valeurs disponibles pour le compilateur.
Et puis il y a un troisième type connexe: les variables dont la valeur ne change pas, c'est-à-dire les noms d'une valeur. La différence entre une de ces variables immuables et une constante est lorsque la valeur est déterminée / affectée / initialisée: une variable est initialisée au moment de l'exécution, mais la valeur d'une constante est connue pendant le développement. Cette distinction est un peu confuse car une valeur peut être connue pendant le développement mais n'est en fait créée que lors de l'initialisation.
Mais si la valeur d'une constante est connue au moment de la compilation, le compilateur peut effectuer des calculs avec cette valeur. Par exemple, le langage Java a le concept d' expressions constantes . Une expression constante est toute expression qui se compose uniquement de littéraux de primitives ou de chaînes, d'opérations sur des expressions constantes (telles que la conversion, l'addition, la concaténation de chaînes) et de variables constantes. [ JLS §15.28 ] Une variable constante est une final
variable qui est initialisée avec une expression constante. [JLS §4.12.4] Donc pour Java, c'est une constante de temps de compilation:
public static final int X = 7;
Cela devient intéressant lorsqu'une variable constante est utilisée dans plusieurs unités de compilation, puis la déclaration est modifiée. Considérer:
Maintenant, lorsque nous compilons ces fichiers, le B.class
bytecode déclarera un champ Y = 9
car il B.Y
s'agit d'une variable constante.
Mais lorsque nous changeons la A.X
variable en une valeur différente (disons X = 0
) et recompilons uniquement le A.java
fichier, nous nous référons B.Y
toujours à l'ancienne valeur. Cet état A.X = 0, B.Y = 9
est incompatible avec les déclarations du code source. Bon débogage!
Cela ne signifie pas que les constantes ne doivent jamais être modifiées. Les constantes sont définitivement meilleures que les nombres magiques qui apparaissent sans explication dans le code source. Cependant, la valeur des constantes publiques fait partie de votre API publique . Cela n'est pas spécifique à Java, mais se produit également en C ++ et dans d'autres langages qui comportent des unités de compilation distinctes. Si vous modifiez ces valeurs, vous devrez recompiler tout le code dépendant, c'est-à-dire effectuer une compilation propre.
Selon la nature des constantes, elles peuvent avoir conduit à des hypothèses incorrectes de la part des développeurs. Si ces valeurs sont modifiées, elles peuvent déclencher un bogue. Par exemple, un ensemble de constantes peut être choisi de manière à former certaines configurations binaires, par exemple public static final int R = 4, W = 2, X = 1
. Si ceux-ci sont modifiés pour former une structure différente comme R = 0, W = 1, X = 2
alors le code existant tel que boolean canRead = perms & R
devient incorrect. Et pensez au plaisir qui allait en résulter Integer.MAX_VALUE
! Il n'y a pas de solution ici, il est juste important de se rappeler que la valeur de certaines constantes est vraiment importante et ne peut pas être modifiée simplement.
Mais pour la majorité des constantes, les modifier va bien se passer tant que les restrictions ci-dessus sont prises en compte. Une constante est sûre de changer lorsque la signification, et non la valeur spécifique, est importante. C'est par exemple le cas pour des paramètres tels que BORDER_WIDTH = 2
ou TIMEOUT = 60; // seconds
ou des modèles tels que API_ENDPOINT = "https://api.example.com/v2/"
- bien que certains ou tous devraient être spécifiés dans les fichiers de configuration plutôt que dans le code.