is this allowed in java:
for(int i=0;i<5;i++){
final int myFinalVariable = i;
}
The keyword of my question is final
. Is it allowed to do a final variable that changes with every run of the loop? I was wondering this because final says that you can't change the value of the variable (calling only myFinalVariable = i
), but i'm redefining the whole variable with final int
.
Are they two completely different variables just with the same name - with the variable from the previous run of the loop already heading down the road to the garbage collector?
As answered, Yes, you may indeed mark the variables in a loop as 'final'. Here is the effect of doing so (Java 7, Eclipse Indigo, Mac OS X Lion).
Yes, it is allowed. The
final
keyword means that you can't change the value of the variable within its scope. For your loop example, you can think of the variable going out of scope at the bottom of the loop, then coming back into scope with a new value at the top of the loop. Assigning to the variable within the loop won't work.A variable is just a location on the stack. Try and keep your variables with as small a scope as possible and try to make them final. However scope and final are just source code things... from a code generation/VM point of view they don't really matter at all.
In your specific example, using "int" no garbage is created. However if it were objects being created then for both cases the amount of garbage and when the garbage would be eligible for cleanup would be identical.
Take the following code:
The compiler produces identical bytecode for each method:
Adding another method that declares the variable outside the loop give you slightly different bytecode due to the order that the variables are declared). Note that this version the variable cannot be made final. This last version is not the best way (the final variable inside the loop is the best if you can do it):
Variable declared inside the loop have the scope only till the single execution of the loop.
Declaring the variable as final inside the loop makes the no difference for the variable in side the loop, but if we declare the variable outside the loop with final modifier then the value assigned to primitive type or Object assigned to the reference variable cannot be changed .
In the below example there is no issue with the first two loops both the loops give same output, but the third loop gives a compile time Error.
public class test {
}
Please do correct me if i am wrong.
You are right, for each iteration in the loop, you are creating a new variable. The variables do share the same name, but that's fine because they are not in the same scope. Next example would not work: