Une variable est juste un emplacement sur la pile. Essayez de garder vos variables petit possible, et essayer de leur faire finale. Toutefois, la portée et la finale sont juste le code source des choses... d'une génération de code/VM point de vue qu'ils n'ont pas vraiment d'importance.
Dans votre exemple, à l'aide de "int" aucun déchet n'est créé. Toutefois, si c'étaient des objets en cours de création alors pour les deux cas, la quantité de déchets et lorsque les déchets serait admissible pour le nettoyage serait identique.
Prenez le code suivant:
public class X
{
public static void main(final String[] argv)
{
foo();
bar();
}
private static void foo()
{
for(int i=0;i<5;i++)
{
final int myFinalVariable = i;
}
}
private static void bar()
{
for(int i=0;i<5;i++)
{
int myFinalVariable = i;
}
}
}
Le compilateur produit identique bytecode pour chaque méthode:
public class X extends java.lang.Object{
public X();
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 foo:()V
3: invokestatic #3; //Method bar:()V
6: return
private static void foo();
Code:
0: iconst_0
1: istore_0
2: iload_0
3: iconst_5
4: if_icmpge 15
7: iload_0
8: istore_1
9: iinc 0, 1
12: goto 2
15: return
private static void bar();
Code:
0: iconst_0
1: istore_0
2: iload_0
3: iconst_5
4: if_icmpge 15
7: iload_0
8: istore_1
9: iinc 0, 1
12: goto 2
15: return
}
L'ajout d'une autre méthode qui déclare la variable en dehors de la boucle de vous donner légèrement différentes bytecode en raison de l'ordre dans lequel les variables sont déclarées). Notez que cette version de la variable ne peut pas être le dernier. Cette dernière version n'est pas la meilleure façon (la dernière variable à l'intérieur de la boucle est le meilleur si vous pouvez le faire):
private static void car()
{
int myFinalVariable;
for(int i=0;i<5;i++)
{
myFinalVariable = i;
}
}
private static void car();
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iconst_5
4: if_icmpge 15
7: iload_1
8: istore_0
9: iinc 1, 1
12: goto 2
15: return
}