Originally posted by Ernest Friedman-Hill:
There's a school of thought that says that this helps with code understanding. If a variable is final, then it's obvious that the value never changes; once you know the value, you know it's never going to change.
I belong to that school of thought
I used to never use final, but started doing so about six months ago. It makes understanding the code at a later date slightly faster/easier. I know on first read of a method (even a short one) that the variable will not be modified. Otherwise, I would have to read it an extra time. And that does add up.
More importantly, using final to declare your intent allows for static code analyzers (like PMD) and the compiler to be your friend. If you usually declare local variables final and don't somewhere, you re-examine your code when the static analyzer reminds you about it. Since bugs cluster, this gets you looking at a piece of code that is more likely to have a bug in it. At the opposite end of the spectrum, the compiler will stop you from accidently modifying that variable in the future when you are maintaining the code. The original author may have made some assumptions about the variable not changing.
Granted this is more important in long methods, but it is still useful in shorter ones. And many of us (myself included) aren't at the point where all our methods are five lines!