Commentaire de l'espace trop petit, donc, voici quelques informations pour vous sur l'utilisation de l' static final
. Comme je l'ai dit dans mon commentaire à l'Andrzej réponse, seule primitive et de la Chaîne sont compilées directement dans le code comme des littéraux. Pour démontrer cela, essayez les solutions suivantes:
Vous pouvez le voir en action par la création de trois classes (dans des fichiers séparés):
public class DisplayValue {
private String value;
public DisplayValue(String value) {
this.value = value;
}
public String toString() {
return value;
}
}
public class Constants {
public static final int INT_VALUE = 0;
public static final DisplayValue VALUE = new DisplayValue("A");
}
public class Test {
public static void main(String[] args) {
System.out.println("Int = " + Constants.INT_VALUE);
System.out.println("Value = " + Constants.VALUE);
}
}
Compiler et exécuter le Test, qui s'imprime:
Int = 0
Valeur = Un
Maintenant, changez Constants
à avoir une valeur différente pour chacun et viens de compiler la classe Constants
. Lorsque vous exécutez Test
(sans avoir à recompiler le fichier de classe) elle affiche toujours l'ancienne valeur de INT_VALUE mais pas la VALEUR. Par exemple:
public class Constants {
public static final int INT_VALUE = 2;
public static final DisplayValue VALUE = new DisplayValue("X");
}
Exécuter le Test sans avoir à recompiler Test.java
:
Int = 0
Valeur = X
Notez que n'importe quel autre type utilisé avec static final
est gardé comme référence.
Similaire à C/C++ #si/#endif, une constante littérale ou de celui défini par static final
avec les primitives utilisées dans une Java ordinaire if
condition et l'évalue à l' false
entraîne le compilateur à la bande de byte code pour les instructions à l'intérieur de l' if
bloc (ils ne seront pas générés).
private static final boolean DEBUG = false;
if (DEBUG) {
...code here...
}
Le code "" code ici..." ne devrait pas être compilé en byte code. Mais si vous avez changé d' DEBUG
de true
alors qu'il serait.