De Portée limitée, qui est le Mieux
Utilisez votre seconde option:
for ( ... ) {
String s = ...;
}
Champ d'application N'Affecte pas les Performances
Si vous démontez le code compilé à partir de chacun (avec le JDK de l' javap
outil), vous verrez que la boucle compile à la même JVM instructions dans les deux cas. Notez également que Brian R. Bondy est "l'Option #3" est identique à l'Option #1. Rien de plus est ajouté ou retiré de la pile lors de l'utilisation du resserrement de la portée, et les mêmes données sont utilisées sur la pile dans les deux cas.
D'Éviter L'Initialisation
La seule différence entre les deux cas est que, dans le premier exemple, la variable s
est inutilement initialisé. C'est une question distincte de l'emplacement de la déclaration de la variable. Cela ajoute deux gaspillage d'instructions (pour charger une constante de chaîne et de le stocker dans un cadre de pile fente). Un bon outil d'analyse statique va vous avertir que vous n'êtes jamais à la lecture de la valeur que vous attribuez à s
, et un bon compilateur JIT sera probablement éluder lors de l'exécution.
Vous pouvez résoudre ce problème en utilisant simplement un vide déclaration (c'est à dire, String s;
), mais cela est considéré comme une mauvaise pratique et a un autre effet secondaire discuté ci-dessous.
Souvent une fausse valeur, comme null
est affectée à une variable simplement de faire taire une erreur de compilateur que la variable est lue sans être initialisé. Cette erreur peut être pris comme un indice que la portée des variables est trop grand, et qu'il est déclaré avant, il est nécessaire de recevoir une valeur valide. Des déclarations vides de vous forcer à tenir compte de tous code de la route; ne pas ignorer cette précieuse mise en garde par l'attribution d'une fausse valeur.
Économiser La Pile De Fentes
Comme mentionné, alors que la JVM instructions sont les mêmes dans les deux cas, il y a un subtil effet de bord qui le rend meilleur, au niveau de la JVM, à utiliser le plus de portée limitée possible. Ceci est visible dans la "variable locale" de table pour la méthode. Examinons ce qui se passe si vous avez de multiples boucles, avec les variables déclarées dans inutilement grande portée:
void x(String[] strings, Integer[] integers) {
String s;
for (int i = 0; i < strings.length; ++i) {
s = strings[0];
...
}
Integer n;
for (int i = 0; i < integers.length; ++i) {
n = integers[i];
...
}
}
Les variables s
et n
pourrait être déclarée à l'intérieur de leurs respectifs des boucles, mais depuis ils ne le sont pas, le compilateur utilise deux "trous" dans le cadre de la pile. S'ils ont été déclarés à l'intérieur de la boucle, le compilateur peut réutiliser le même logement, faire la trame de pile plus petite.
Ce Qui Compte Vraiment
Cependant, la plupart de ces questions sont négligeables. Un bon compilateur JIT verrez qu'il n'est pas possible de lire la valeur initiale vous sont inutilement l'affectation, et d'optimiser l'affectation de l'écart. L'enregistrement d'un logement d'ici ou là ne va pas faire ou casser votre application.
La chose importante est de rendre votre code lisible et facile à entretenir, et à cet égard, l'utilisation d'une portée limitée à l'est nettement mieux. Le plus petit de la portée d'une variable a, plus il est facile de comprendre comment il est utilisé et quel est l'impact de tout changement du code.