Au moment de la compilation des constantes et des variables
Le langage Java documentation dit:
Si un type primitif ou une chaîne de caractères est défini comme une constante et la valeur
est connu au moment de la compilation, le compilateur remplace le nom de constante
partout dans le code, avec sa valeur. Ceci est appelé au moment de la compilation
constante.
Ma compréhension est que si nous avons un morceau de code:
private final int x = 10;
Ensuite, le compilateur remplace chaque occurrence de x
dans le code avec littérale 10
.
Mais supposons que la constante est initialisé au moment de l'exécution:
private final int x = getX(); //here getX() returns an integer value at run-time.
Une chute des performances (quelle qu'en soit négligeable, il peut être) par rapport à la constante de compilation?
Une autre question est de savoir si les dessous de la ligne de code:
private int y = 10; //here y is not final
est traitée de la même manière constante à la compilation par le compilateur?
Enfin, ce que je comprends de l'réponses sont:
final static
signifie constante à la compilation- juste
final
signifie que c'est une constante, mais est initialisé au moment de l'exécution - juste
static
signifie initialisé au moment de l'exécution - sans
final
est une variable et ne pas être traitées comme constante.
Est ma compréhension correcte?
- sur le point 2. Vous vous trompez! final int a =1; a est la compilation constante de temps. final int b; b =1; b n'est pas
Vous devez vous connecter pour publier un commentaire.
Compiler constante de temps doit être:
Donc
private final int x = getX();
n'est pas constante.À la deuxième question
private int y = 10;
n'est pas constante (non définitif dans ce cas), de sorte que l'optimiseur ne peut pas être sûr que la valeur ne changera pas dans l'avenir. Donc, il ne peut pas optimiser-il aussi bon que la valeur de la constante. La réponse est: Non, il n'est pas traité de la même façon que le temps de compilation constante.final
variable ne remplit pas les critères pour être considéré comme un constant, il est désigné comme unfinal
variable. Vous ne trouverez pas le terme de constante à la compilation dans le JLS>. msi été abordé dans son commentaire ci-dessus, et je l'ai ajouté à ma réponse ci-dessous.case
ne prend que expression constante, de sorte que seule constante ou une expression constante de compiler. juridiques, par exemple -final int i = 2; switch(x) { case i:case i+2: }
La JLS fait les distinctions suivantes entre
final
des variables et des constantes:final
variablesconstantes
À partir de cette définition, nous pouvons discerner une constante doit être:
final
String
final
)Que sur des constantes de compilation?
La JLS ne contient pas l'expression constante à la compilation. Cependant, les programmeurs utilisent souvent les termes " constante à la compilation et constante de façon interchangeable.
Si un
final
variable ne répondent pas aux critères énoncés ci-dessus pour être considéré comme une constante, il devrait techniquement être considéré comme unefinal
variable.Il pourrait être un vraiment petit chute des performances sur certains machines pour
private final int x = getX();
depuis qui impliquerait au moins un appel de méthode (outre le fait que ce n'est pas une constante de compilation), mais comme vous l'avez dit, il serait négligeable pourquoi s'embêter?Quant à la seconde question:
y
n'est pas définitive et n'est donc pas une compilation constante de temps, puisque l'on peut changer lors de l'exécution.La
final
mot-clé signifie qu'une variable sera initialisée une fois et une seule fois. Un réel besoin constant d'être déclaréstatic
ainsi.Donc, aucun de vos exemples sont traités comme des constantes par le compilateur. Néanmoins, le dernier mot vous dit (et pour le compilateur) que les variables qui vont être initialisé qu'une seule fois (dans le constructeur ou littéralement).
Si vous avez besoin de leurs valeurs attribuées au moment de la compilation de vos champs doivent être statiques.
Performance n'est pas vraiment affecté, mais avoir à l'esprit que les types primitifs sont immuables, une fois que vous avez créé un, il considérera que la valeur en mémoire jusqu'à ce que le garbage collector supprime.
Donc, si vous avez une variable
y = 1;
et puis vous modifiez ày = 2;
dans la mémoire de la JVM aura à la fois des valeurs, mais votre variable "point" de ce dernier.Pas. C'est une variable d'instance, créée, initialisé un utilisé lors de l'exécution.
Selon JLS, il n'est pas nécessaire que la "constante" doit être statique.
Donc "constante" peut-être statiques ou non statique (variable d'instance).
Mais JLS impose certaines exigences pour une variable à une "constante" (en plus d'être juste de finale):
4.12.4. les Variables final (JLS)
15.28. des Expressions Constantes
private final int x = getX();
Seront appelés à la première fois que votre objet est déclaré. La performance "drop" dépendra de
getX()
mais ce n'est pas le genre de choses à créer de goulot d'étranglement.Chaque primitive Littérale et Littéral de Chaîne est une constante de compilation.
Voir: https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.28