Une variable est juste un emplacement sur la pile. Essayez de garder vos variables aussi petites que possible et essayez de les rendre définitives. Cependant, la portée et la finale ne sont que des choses de code source ... du point de vue de la génération de code/VM, elles n'ont pas vraiment d'importance.
Dans votre exemple spécifique, l'utilisation de "int" aucune poubelle est créée. Cependant, s'il s'agissait d'objets créés, dans les deux cas, la quantité de déchets et le moment où les déchets seraient éligibles pour le nettoyage seraient identiques.
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 bytecode identique 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
}
Ajouter une autre méthode qui déclare la variable en dehors de la boucle vous donner bytecode légèrement différente en raison de la ordonner que les variables soient déclarées). Notez que cette version la variable ne peut pas être rendue finale. Cette dernière version est pas la meilleure façon (la dernière variable dans 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
}