Pourquoi est-ce :
mieux que cela ?
Est-il nécessaire de déclarer les variables à l’extérieur de la boucle ?
Pourquoi est-ce :
mieux que cela ?
Est-il nécessaire de déclarer les variables à l’extérieur de la boucle ?
Dans votre exemple, je présume str
est pas utilisé en dehors de l' while
boucle, sinon vous ne poseriez pas la question, parce que la déclaration à l'intérieur de l' while
boucle ne serait pas une option, car il ne serait pas compiler.
Ainsi, depuis str
est pas utilisé en dehors de la boucle, la plus petite étendue possible pour str
est à l'intérieur de la boucle while.
Donc, la réponse est catégoriquement qu' str
absolument doit être déclarée à l'intérieur de la boucle while. Pas de si, pas de padn, pas de buts.
Le seul cas où cette règle est susceptible d'être lésé est si pour une raison quelconque, il est d'une importance vitale que chaque cycle d'horloge doit être pressé de le code, dans ce cas, vous pourriez envisager de l'instanciation de quelque chose à l'extérieur de son champ d'application et de le réutiliser au lieu de re-instanciation à chaque itération de l'un à l'intérieur de la portée. Cependant, ceci ne s'applique pas à votre exemple, en raison de l'immutabilité de chaînes de caractères en java: une nouvelle instance de str sera toujours créé dans le début de la boucle et il devra être jetés à la fin, donc il n'y a pas de possibilité d'optimiser.
EDIT: (c'est quelque chose que j'ai écrit dans un commentaire ci-dessous, mais je pense qu'il vaut la peine de faire partie de la réponse.)
Dans tous les cas, la bonne façon de faire les choses est d'écrire tout le code correctement, d'établir une exigence de performance pour votre produit, vous pouvez mesurer votre produit final à l'encontre de cette exigence, et si elle ne répond pas, puis aller à optimiser les choses. Et ce qui finit généralement qui se passe est que vous devez trouver des moyens de fournir quelques belles et formel, algorithmique des optimisations dans juste un couple des endroits qui font de notre programme de répondre à ses exigences de performance au lieu d'avoir à parcourir l'ensemble de votre base de code et de le tordre et de pirater les choses dans l'ordre de serrer les cycles d'horloge ici et là.
J'ai comparé le code octet de ces deux (similaire) exemples:
Regardons 1. exemple:
package inside;
public class Test {
public static void main(String[] args) {
while(true){
String str = String.valueOf(System.currentTimeMillis());
System.out.println(str);
}
}
}
après l' javac Test.java
, javap -c Test
vous obtiendrez:
public class inside.Test extends java.lang.Object{
public inside.Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: invokestatic #2; //Method java/lang/System.currentTimeMillis:()J
3: invokestatic #3; //Method java/lang/String.valueOf:(J)Ljava/lang/String;
6: astore_1
7: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
10: aload_1
11: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
14: goto 0
}
Regardons 2. exemple:
package outside;
public class Test {
public static void main(String[] args) {
String str;
while(true){
str = String.valueOf(System.currentTimeMillis());
System.out.println(str);
}
}
}
après l' javac Test.java
, javap -c Test
vous obtiendrez:
public class outside.Test extends java.lang.Object{
public outside.Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: invokestatic #2; //Method java/lang/System.currentTimeMillis:()J
3: invokestatic #3; //Method java/lang/String.valueOf:(J)Ljava/lang/String;
6: astore_1
7: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
10: aload_1
11: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
14: goto 0
}
Les observations montre qu'il n'y a pas de différence entre ces deux exemples. C'est le résultat des spécifications de la JVM...
Mais au nom de meilleures pratiques de codage, il est recommandé de déclarer la variable dans la plus petite étendue possible (dans cet exemple, il est à l'intérieur de la boucle, comme c'est le seul endroit où la variable est utilisée).
Déclarer des objets de la plus petite étendue d'améliorer la lisibilité.
La Performance n'a pas d'importance aujourd'hui, pour les compilateurs.(dans ce scénario)
À partir d'un point de vue de l'entretien, le 2ème est la meilleure option.
Déclarer et initialiser des variables dans le même lieu, dans l'étendue la plus étroite possible.
Comme Donald Ervin Knuth a dit:
"On devrait oublier les petites efficacité, disons environ 97% du temps: l'optimisation prématurée est la racine de tous les maux"
j'.e) la situation où un programmeur permet de considérations de performance incidence sur la conception d'un morceau de code. Cela peut entraîner une conception qui n'est pas aussi propre qu'il pourrait avoir été ou le code est incorrect, car le code est compliqué par l' optimisation et le programmeur est distrait par l'optimisation.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.