Một biến chỉ là một vị trí trên stack. Hãy thử và giữ các biến của bạn với phạm vi nhỏ nhất có thể và cố gắng làm cho chúng trở thành cuối cùng. Tuy nhiên phạm vi và cuối cùng chỉ là những thứ mã nguồn ... từ một thế hệ mã/quan điểm VM, chúng không thực sự quan trọng chút nào.
Trong ví dụ cụ thể của bạn, sử dụng "int" không có rác được tạo. Tuy nhiên nếu nó là đối tượng được tạo ra thì cả hai trường hợp lượng rác và khi rác sẽ đủ điều kiện để dọn dẹp sẽ giống nhau.
Đi đoạn mã sau:
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;
}
}
}
Trình biên dịch tạo ra bytecode giống hệt nhau cho từng phương pháp:
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
}
Thêm một phương pháp khai báo biến bên ngoài vòng cung cấp cho bạn bytecode hơi khác nhau do thứ tự các biến được khai báo). Lưu ý rằng phiên bản này biến không thể được thực hiện cuối cùng. Phiên bản cuối cùng này không phải là cách tốt nhất (biến thức bên trong vòng lặp là tốt nhất nếu bạn có thể làm điều đó):
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
}