It's probably not the optimum design choice. In Java 8, along with lambda expression, this requirement of final hopefully will be dropped.
The goal is to forbid assigning to the local variable from the anonymous class. But this doesn't require marking the local variable as final.
void f()
Object var = ...;
new Anon(){
...
print(var); // reading is ok
var = x; // error, can't write to var [1]
}
The compiler actually makes a copy of the var and save it in the anonymous class. The anonymous class only accesses the copy afterwards. The code above is actually transformed to
void f()
Object var = ...;
new Anon$1(var);
class Anon$1
{
final Object $var;
Anon$1(Object var){ this.$var=var; }
...
print($var);
$var = x; // error, naturally [2]
}
As you can see, there is no technical reason to require that var is final. All compiler has to do, when it encounters [2], knowing that $var is a synthesized field for var, report error "local variable var cannot be assigned to by the anonymous class" (instead of "$var is final and cannot be assigned to")
The language designers chose to annoy us by requiring the final keyword on the local variable; I don't remember the rationale; in general Java wasn't afraid of verbosity if clarity is desired.