I just want to distance myself from the performance argument. This is really bad and misunderstood reason to use final. There are plenty of non-final things which can prevent methods from being inlined and there is nothing to stop a compiler inlining a non-final method (such as if it’s reentrant).
People can come up with theoretical arguments as to why Java can’t optimize a non-final method or class, but because optimizations are performed at runtime there is also nothing to stop them being unrolled and re-optimized at runtime.
Google’s V8 JavaScript engine does this. It optimizes your code presuming a range of corner cases will not occur, which allows it to perform more aggressive optimizations. If you hit one of those corner case then it throws away the optimized code and you get terrible performance. But for 99.9% of JS out there this strategy works and improves performance. There is no reason why a Java runtime can’t do the same (and I believe HotSpot already does in some cases).
I also second that variables should be final unless declared ‘mutable’, and would also like to see non-final local variables colored differently. As Cas said there is nothing to stop you looking through looking for an assignment, especially with the variable highlighting you get in IDEs now. But I’d rather that I could be told this information in one place without having to look anywhere else. Final does this.
However for methods and classes I try to avoid using final unless I have a good reason to.